2016-08-31 7 views
0

스프링 부트기반 응용 프로그램에서 ResponseEntityExceptionHandler을 사용하여 오류를 단일 장소에서 캡처하고 일관된 오류 페이로드를 출력합니다.Spring ResponseEntityExceptionHandler와 원래의 POST 페이로드

모든 것이 예상대로 작동합니다. ResponseEntityExceptionHandler에는 유효하지 않은 메시지 (내 경우에는 JSON 페이로드)를 보내는 클라이언트에 "반응"하는 데 사용할 수있는 handleHttpMessageNotReadable 메서드가 있습니다.

다시 예상대로 작동합니다. 클라이언트 POST 잘못된 JSON 문서 인 경우 handleHttpMessageNotReadable의 코드가 올바르게 실행됩니다.

이제 모니터링을 위해 잘못된 JSON을 기록하고 싶습니다. 페이로드를 확보하기 위해 handleHttpMessageNotReadable 메서드 내부에서 사용하는 코드입니다.

java.lang.IllegalStateException: getInputStream() has already been called for this request 

원본에 액세스 할 수있는 간단한 방법이 될 것입니다 무엇 : 예상대로 스트림이 이미 잭슨에 의해 소비되어 있기 때문에

String line = null; 
StringBuffer jb = new StringBuffer(); 
try { 
    BufferedReader reader = servletWebRequest.getRequest().getReader(); 
    while ((line = reader.readLine()) != null) 
     jb.append(line); 

} catch (IOException e) { 
     e.printStackTrace(); 
} 

, 나는 실제로 JSON 페이로드를 구문 분석 예외를 얻을 POST 페이로드? 원본 페이로드 (MyException extends HttpMessageNotReadableException)를 포함하는 사용자 지정 예외를 throw 할 수 있습니까?

답변

1

요청 체에 의해 Java 형으로 변환된다 JSON 하는 오류가 발생할 경우, HttpMessageNotReadableException는 슈퍼 클래스 org.springframework.http에 슬로우 org.springframework.http.converter.json.MappingJackson2HttpMessageConverter

.converter.json.AbstractJackson2HttpMessageConverter # readJavaType

MappingJackson2HttpMessageConverter를 서브 클래스 화하여 readJavaType (..)을 덮어 쓰고 거기서 자신의 예외 또는 사용자 정의 된 HttpMessageNotReadableException을 던집니다.

clone the input stream 일 가능성이 높습니다. JSON을 비 직렬화하려고 시도 할 때 사용하고, 예외를 throw해야하는 경우에 사용할 코드를 사용해야합니다. 성능에 영향을 미칠 수 있지만 문제가 아닌 경우 시도해보십시오.

+0

감사합니다. 귀하의 접근 방식은 트릭을 수행했습니다. 나는'MappingJackson2HttpMessageConverter'의 서브 클래스를 만들고'read' 메소드를 덮어 썼습니다. 부팅에서 작동 할 수있는 새로운 매퍼 위해서는 , 나는 단순히'Bean' @ 내 구성에서, 그래서 같은 선언 : '@Bean 공공 MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter()() {새로운 PayloadCaptureMappingJackson2HttpMessageConverter을 반환 ; }' – Luciano

관련 문제