2011-02-09 2 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]

하지만 내가 curl -H를 사용하면 "Accept : application/json"-v "http://localhost.com:8080/test"가 작동하고 반환 된 json 응답. "application/xml"도 효과가있었습니다.

json 또는 xml과 함께 사용할 수 있도록 처리해야하는 예외 처리기에는 특별한 것이 있습니까? 감사!

답변

7

AnnotationMethodHandlerExceptionResolver에는 HttpMessageConverter의 고유 한 배열이있는 것으로 보입니다. 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

@ 보보 : 당신의 맥락에서 콩을 선언하려 했습니까? 그것은 잘 작동합니다. – axtavt

+0

@axtavt : 죄송합니다. 스프링 랜드의 진정한 초심자입니다. "bean을 당신의 상황에서 선언하라"는 것은 스프링 설정 파일에서 그것을 선언하는 것을 의미합니까? – Bobo

관련 문제