Почему я получаю внутреннюю ошибку сервера, когда пытаюсь вернуть объект из маршрута Dancer2 с помощью сериализатора JSON?

У меня есть приложение Dancer2, которое я хочу вернуть сериализованной версии объекта с помощью сериализатора JSON. Вот его небольшая версия:

{
  package User;

  use Moo;
  use Types::Standard qw/Str/;
  has name => (is=>'ro',isa =>Str, default => "");

  sub TO_JSON { return { %{ shift() } };}
}

use Dancer2;
set serializer => 'JSON';
set engines=>{serializer=>{JSON=>{allow_blessed=>1,convert_blessed=>1}}};

get '/hello/:name' => sub {
  my $user = User->new({name=>route_parameters->{name}});
  return $user->TO_JSON;  ## error if the TO_JSON method is not explicitly called. 
};
dance;
1;

Если метод TO_JSON вызывается явно, то, очевидно, объект возвращается как хэш-ссылка, а затем сериализуется как:

{"name":"fred"}

В качестве примера. Если последняя строка в GET

return $user;

то возвращается следующая ошибка:

{"title":"Error 500 - Internal Server Error","message":"","status":500,"exception":"Unrecognized response type from route: User.\n"}

Я думал, что установка allow_blessed и convert_blessed будет автоматически обрабатывать вызов TO_JSON, однако я не могу найти документацию по этому поводу для Dancer2. Это что-то сбросили?


person Peter Staab    schedule 26.02.2017    source источник


Ответы (1)


Dancer2 не поддерживает возврат произвольных объектов из обработчиков маршрутов. Вы можете возвращать только объекты следующих типов< /а>:

  • Пакет::Ответ
  • Dancer2::Core::Отклик
  • Dancer2::Core::Response::Delayed

Тип проверяется перед сериализацией, поэтому сериализатор даже не вызывается, если тип объекта не поддерживается.

Похоже, произвольные объекты поддерживались в какой-то момент, но не более того. Обходной путь состоит в том, чтобы вернуть неблагословленную ссылку, как вы уже обнаружили.

person ThisSuitIsBlackNot    schedule 26.02.2017