为什么我会得到"内部服务器错误"当我尝试使用JSON序列化程序从Dancer2路径返回一个对象时?

时间:2017-02-26 17:14:23

标签: perl dancer

我有一个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_blessedconvert_blessed会自动处理TO_JSON,但是我无法找到关于Dancer2的文档。这件事被丢弃了吗?

1 个答案:

答案 0 :(得分:0)

Dancer2不支持从路由处理程序返回任意对象。您只能返回following types

的对象
  • 普拉克::响应
  • Dancer2 ::核心::响应
  • Dancer2 ::核心::响应::延迟

在序列化之前检查类型,因此如果不支持对象类型,则永远不会调用序列化程序。

看起来任意对象都是supported at one point,但不再是。{解决方法是返回一个非祝福的引用,正如您已经发现的那样。