2011-02-09 18 views
6

código es así:ExceptionHandler volver JSON o XML que no trabajan en la primavera MVC 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; 
    } 

} 

cuando traté rizo -H "Accept: application/json" -v "http://localhost.com: 8080/testerror " Recibí este error: org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver - No se pudo encontrar HttpMessageConverter que admita el tipo de devolución [class com.kibboko.poprocks.appservices.dtos.ErrorTO] y [aplicación/json]

pero si intento curl -H "Aceptar: application/json" -v "http://localhost.com:8080/test", trabajado y respuesta json devuelta. "application/xml" funcionó también.

¿Hay algo especial acerca del controlador de excepciones que debo cuidar para que funcione con json o xml? ¡Gracias!

Respuesta

7

Parece que AnnotationMethodHandlerExceptionResolver tiene su propia matriz de HttpMessageConverter s. Debe configurarlo para usar la misma matriz que la utilizada por AnnotationMethodHandlerAdapter.

Sin embargo, puede ser complicado cuando AnnotationMethodHandlerAdapter se declara implícitamente. Tal vez se declara lo siguiente FactoryBean puede ayudar en todos los casos:

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

Eso es realmente una molestia. ¿Sería posible encontrar una solución más simple? ¿Me puedes dar un ejemplo de trabajo? – Bobo

+0

@Bobo: ¿Has intentado declarar ese frijol en tu contexto? Debería funcionar bien. – axtavt

+0

@axtavt: lo siento, soy un verdadero novato en Spring land. ¿Por "declarar ese frijol en tu contexto" te refieres a declararlo en el archivo de configuración de primavera? – Bobo

Cuestiones relacionadas