2017-02-26 10 views
1

JSON serializer를 사용하여 객체의 직렬화 된 버전을 반환하려는 Dancer2 응용 프로그램이 있습니다. TO_JSON 방법이 명시 적으로 호출하는 경우JSON 시리얼 라이저를 사용하여 Dancer2 경로에서 객체를 반환하려고하면 "내부 서버 오류"가 발생하는 이유는 무엇입니까?

{ 
    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; 

, 다음 분명히 객체의 해시 심판으로 반환 다음으로 직렬화 :

{"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에 대한 문서. 이게 떨어 뜨린 것입니까?

답변

0

Dancer2는 경로 처리기에서 임의의 개체를 반환하는 것을 지원하지 않습니다.

  • Plack :: 응답
  • Dancer2 :: 코어 :: 응답
  • Dancer2 :: 코어 :: 응답 : 지연

유형 : 당신은 단지 following types의 객체를 반환 할 수 있습니다 직렬화 전에 검사되기 때문에 객체 유형이 지원되지 않으면 직렬 변환기가 호출되지 않습니다.

임의 개체가 supported at one point 인 것처럼 보이지만 더 이상 보이지 않습니다. 해결 방법은 이미 발견 한 것처럼 축복받은 참조를 반환하는 것입니다.