2011-04-12 33 views
6

¿Alguien sabe por qué no puedo usar @ResponseStatus(reason = "My message") en un manejador de excepciones en Spring MVC mientras todavía devuelvo @ResponseBody. Lo que parece ocurrir es que si uso el atributo reasonSpring MVC: using @ResponseStatus (reason = '') en un manejador de excepciones @ResponseBody en tomcat

// this exception handle works, the result is a 404 and the http body is the json serialised 
// {"message", "the message"} 
@ExceptionHandler 
@ResponseStatus(value = HttpStatus.NOT_FOUND) 
public Map<String, String> notFoundHandler(NotFoundException e){ 
    return Collections.singletonMap("message", e.getMessage()); 
} 

// this doesn't... the response is a 404 and the status line reads 'Really really not found' 
// but the body is actually the standard Tomcat 404 page 
@ExceptionHandler 
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Really really not found") 
public Map<String, String> reallyNotFoundHandler(ReallyNotFoundException e){ 
    return Collections.singletonMap("message", e.getMessage()); 
} 

El code for this example ha terminado en github.

+0

Mismo problema aquí: http://stackoverflow.com/questions/ 29075160/no-responsebody-returned-from-exceptionhandler-in-spring-boot-app-deployed-in –

Respuesta

5

Parece que este es un resultado directo de la siguiente código de AnnotationMethodHandlerExceptionResolver

private ModelAndView getModelAndView(Method handlerMethod, Object returnValue, ServletWebRequest webRequest) 
     throws Exception { 

    ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(handlerMethod, ResponseStatus.class); 
    if (responseStatusAnn != null) { 
     HttpStatus responseStatus = responseStatusAnn.value(); 
     String reason = responseStatusAnn.reason(); 
     if (!StringUtils.hasText(reason)) { 
      // this doesn't commit the response 
      webRequest.getResponse().setStatus(responseStatus.value()); 
     } 
     else { 
      // this commits the response such that any more calls to write to the 
      // response are ignored 
      webRequest.getResponse().sendError(responseStatus.value(), reason); 
     } 
    } 
    /// snip 
} 

Esto ha sido reportado a SpringSource en SPR-8251:

3

Para el registro, desde la primavera de 3.2, esto se hizo aún peor porque el AnnotationMethodHandlerExceptionResolver ha sido sustituido por el ResponseStatusExceptionResolver y lo hace:

T Vale la pena un informe de error. Además, el @ResponseStatus está documentado con setStatus y está mal diseñado. Debería haber sido llamado @ResponseError.

He creado dos problemas para esto finalmente: SPR-11192 y SPR-11193.

Ha pasado casi un año y mis dos problemas siguen abiertos. No considero a Spring WebMVC como un marco REST de primera clase que no lo es, Web MVC es para humas y no para máquinas :-(

+0

@BartoszKP ¿Por qué eliminaste las ediciones en MI respuesta? –

+1

1) Solo edité "editar indicadores". La respuesta debe ser coherente en su conjunto, el hecho de qué parte se agregó cuando es completamente irrelevante para una persona que busca una solución a su problema. Si alguien está interesado en la historia de la publicación, todavía está disponible fácilmente. 2) Esta no es * tu * respuesta. Usted es el autor, pero pertenece a SO. – BartoszKP

+0

@BartoszKP ¡Ridículo, en serio! –

Cuestiones relacionadas