2013-07-23 2 views
1

javascript가 뷰에서 사용되는 json 오류 객체를 생성하는 예외 처리기가 있습니다.Spring @ExceptionHandler - @RequestMapping만을 생성하는 json에 적용

@ControllerAdvice 
public class ExceptionHandlerController { 


    @ExceptionHandler(value = Exception.class) 
    @ResponseBody 
    public final JsonResponse<Void> handleJsonException(
      final Exception e, 
      final HttpServletRequest request, 
      final HttpServletResponse response) { 
     response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
     return new ErrorJsonResponse(e); 
    } 

} 

일반 게시 (비 json) 요청에 대해이 메서드를 실행하지 않으려합니다. 그래서 WEB.XML 오류 페이지로 구성된 이런 종류의 예외를 처리하고 싶습니다.

<error-page> 
    <error-code>500</error-code> 
    <location>/500</location> 
</error-page> 

json을 반환하는 @RequestMapping 메서드에서 명시 적으로 생성 값을 설정합니다.

@RequestMapping(value = "/dosomething", 
     method = RequestMethod.POST, 
     produces = MediaType.APPLICATION_JSON_VALUE) 

생산 콘텐츠 유형에 따라 특정 예외 처리기를 사용하려면 어떻게해야합니까?

+0

스프링'@ ControllerAdvice'는 400, 401 등의 HTTP 오류 유형을 처리하지 못합니다. 한 번 이러한 문제가 있지만 URL 기반 패턴을 뒤집을 수있었습니다 (모든 JSON 요청 '/ api' 컨텍스트로 호출되었습니다). web.xml의 위치를'@ Controller'로 리다이렉션하고 요청에 대한 정보를 파싱하려고 시도하면 그 후에 @ControllerAdvice'를 잡을 특정 예외가 발생합니다. –

+0

ExceptionHandler가 컨트롤러를 throw하는 모든 예외를 처리합니다. 따라서 볼 수있는 유일한 방법은 응용 프로그램 내부에서 오류 페이지를 이동하고 ExceptionHandler 메서드에서 반환 할 페이지를 선택하는 것입니다. 이를 위해 HttpServletRequest를 사용할 수 있습니다. – mvb13

답변

0

@ControllerAdvice 주석이 달린 클래스는 응용 프로그램의 알려진 컨트롤러를 모두 지원합니다. 개발자는 일반적으로 특정 비즈니스/기술적 예외를 사용하여 ExceptionHandlers를 제한합니다. 이 경우 Exception.class이 너무 광범위합니다.

유즈 케이스가 유효합니다. 실제로,이 문제는 다가오는 Spring 4.0 릴리스에서 해결되었습니다 (SPR-10222 참조).

당신은 예를 들어 @ControllerAdvice(annotations = RestController.class)과 어노테이션 RestExceptionHandlerController을 가질 수 - @RestController 주석이되어 당신의 REST 컨트롤러 제공 (모든 방법에 대한 @ResponseBody을 의미 주석!).

그러나이 새로운 기능은 (클라이언트의 요청에 따라 런타임에 협상 된) MediaTypes에 의존하지 않고 주석, assignabletypes, 패키지, 기본 패키지 클래스에 의존합니다 ...이 코드는 주석이 달린 @ControllerAdvice 수업.

관련 문제