2016-12-05 3 views
3

하나의 REST API 메서드가 있습니다. 응답으로 Xml을 반환합니다. 단순함을 위해 단순한 Exception을 발생시키는 것으로 가정합니다.봄 mvc - XML ​​및 JSON 응답에 대한 오류 처리 구성

@RequestMapping(value = "machine/xmlData", method = RequestMethod.GET, produces = "application/xml") 
    public ResponseEntity<String> getXml(HttpServletRequest request) 
      throws Exception { 
     return getDataFromService(); 

} 

이제 REST 컨트롤러에서 예외를 처리하고 있습니다. 이 일반적인 예외 핸들 다른 API 방법에 대한 방법뿐만 아니라입니다 (XML 또는 JSON 응답)

@ExceptionHandler(Exception.class) 
     @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) 
     public ResponseEntity HandleException(Exception ex, HttpServletRequest request) { 
      ex.printStackTrace(); 
      // here logic to generate Custom error Object 
      return new ResponseEntity<Object>(customErrorObject, HttpStatus.INTERNAL_SERVER_ERROR); 
     } 

사례 1 :. 동의 : "응용 프로그램/XML"과 서비스에서 유효한 응답을 모든 것이 잘 작동합니다.

사례 2 : 수락 : 서비스 에서 "응용 프로그램/XML"과 예외가

을 내 이해 당으로서 다음 내가 406 Not Representable

을 얻을 HandleException에서 ResponseEntity는 JSON이기 때문에 accept header 은 "application/xml"입니다. 왜 제가 406을 얻는 지요.

어쨌든 내가 오류를 보낼 수 있습니까 xml 및 json으로 HandleException 메서드에서 응답? REST API 메소드에 대해 다음과 같이 정의 할 수 있습니다. produces={"application/json","application/xml"} HandleException 메소드에 넣으 려합니다.

팁이 도움이 될 것입니다.

감사합니다.

+0

handleException에서 @ResponseStatus를 제거하고 시도하십시오 – kuhajeyan

+0

@kuhajeyan 도움이되지 않습니다. 나는 – Roxy

답변

1

@ResponseBody 주석 (https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc)을 사용하여 spring-mvc HttpMessageConverters를 활용할 수 있습니다. 이 주석은 주어진 응답 유형에 대해 올바른 messageConverter를 선택해야합니다.

응답은 다음을 수행 할 필요가 XML 또는 JSON 호환되도록하려면 : 귀하의 예외 처리기 방법을

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class WrappedExceptionResponse { 
    public String respone; 

    public String getRespone() { 
     return respone; 
    } 

    public void setRespone(String respone) { 
     this.respone = respone; 
    } 
} 

을 변경

@ExceptionHandler(Exception.class) 
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) 
    public @ResponseBody WrappedExceptionResponse HandleException(Exception ex, HttpServletRequest request) { 
//  ex.printStackTrace(); 
     // here logic to generate Custom error Object 
     WrappedExceptionResponse resp=new WrappedExceptionResponse(); 
     resp.setRespone(ex.getMessage()); 
    return resp; 

다음 예외 응답에 의존하는 것 당신이주는 내용 유형.

+0

을 시도했지만 그 정적은 JSON MediaTypes에 사용할 수 없다. 일부 일반적인 오류 응답을하고 싶습니다. – Roxy

+1

json과 xml 모두 예상대로 작동하는지 Eddited my answer로 확인하십시오. –

+0

도움이되지 않습니다. @ResponseBody가 자동으로 올바른 변환기를 사용하지 않습니다. – Roxy