2011-02-09 6 views
6

コードは次のようである:私はカールしようとした-H "同意する:アプリケーション/ JSONを"exceptionHandlerのは、春のMVCで働いていないJSONやXMLを返す3

@Controller 
    public class TestController { 

     @RequestMapping(value = "/testerror", method = RequestMethod.GET) 
     public @ResponseBody ErrorTO testerror(HttpServletRequest request,HttpServletResponse response) { 
      throw new ABCException("serious error!"); 
     } 


     @ExceptionHandler(ABCException.class) 
     public @ResponseBody ErrorTO handleException(ABCException ex, 
       HttpServletRequest request, HttpServletResponse response) { 
      response.setStatus(response.SC_BAD_REQUEST); 
      return new ErrorTO(ex.getMessage()); 
     } 


    @RequestMapping(value = "/test", method = RequestMethod.GET) 
    public @ResponseBody ErrorTO test(HttpServletRequest request, 
             HttpServletResponse response) { 
     ErrorTO error = new ErrorTO(); 
     error.setCode(-12345); 
     error.setMessage("this is a test error."); 
     return error; 
    } 

} 

-v「http://localhost.com: 8080/testerror " org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver - 戻り値の型[class com.kibboko.poprocks.appservices.dtos.ErrorTO]と[application]をサポートするHttpMessageConverterが見つかりませんでした/ json]

私はカールを試してみると、 "Accept:application/json" -v "http://localhost.com:8080/test"という返されたjson応答。 "application/xml"もうまくいきました。

例外ハンドラについて特別なことはありますか?jsonやxmlで動作するように注意してください。ありがとう!

答えて

7

AnnotationMethodHandlerExceptionResolverHttpMessageConvertersという独自の配列を持っているようです。 AnnotationMethodHandlerAdapterと同じアレイを使用するように構成する必要があります。

ただし、AnnotationMethodHandlerAdapterが暗黙的に宣言されていると複雑になる可能性があります。おそらく、次FactoryBeanを宣言することは、すべての場合に役立つことがあります。

public class AnnotationMethodHandlerExceptionResolverFactoryBean 
     implements FactoryBean<AnnotationMethodHandlerExceptionResolver> { 
    @Autowired 
    private AnnotationMethodHandlerAdapter a; 

    public AnnotationMethodHandlerExceptionResolver getObject() 
      throws Exception { 
     AnnotationMethodHandlerExceptionResolver r = new AnnotationMethodHandlerExceptionResolver(); 
     r.setMessageConverters(a.getMessageConverters()); 
     return r; 
    } 

    ... 
} 
+0

のように思えます。よりシンプルなソリューションを見つけることは可能でしょうか?あなたは私に実例を教えてもらえますか? – Bobo

+0

@Bobo:あなたの文脈でそのbeanを宣言しようとしましたか?それは正常に動作するはずです。 – axtavt

+0

@axtavt:申し訳ありません私は春の土地で本当の初心者です。 「あなたのコンテキストでそのBeanを宣言する」とは、春の設定ファイルで宣言することですか? – Bobo