ExceptionHandler, возвращающий JSON или XML, не работает весной MVC 3 - PullRequest
6 голосов
/ 09 февраля 2011

код такой:

   @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;
    }

}

когда я попробовал curl -H "Принять: application / json" -v "http://localhost.com:8080/testerror" Я получил эту ошибку: org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver - Не удалось найти HttpMessageConverter, поддерживающий тип возвращаемого значения [класс com.kibboko.poprocks.appservices.dtos.ErrorTO] и [application / json]

но если я попробую curl -H "Accept: application / json" -v "http://localhost.com:8080/test", сработало и вернуло ответ json." Application / xml "тоже сработало.

Есть ли что-то особенное в обработчике исключений, о котором мне нужно позаботиться, чтобы он мог работать с json или xml? Спасибо!

Ответы [ 2 ]

7 голосов
/ 09 февраля 2011

Похоже, что 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;
    }

    ...
}
4 голосов
/ 06 мая 2011

Похоже на известную ошибку Spring (исправлено в версии 3.1 M1)

https://jira.springsource.org/browse/SPR-6902

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...