복붙노트

[SPRING] 봄의 독서 요구 몸

SPRING

봄의 독서 요구 몸

봄에는 다음과 같은 끝 점이있는 컨트롤러가 있습니다.

@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public OutputStuff createStuff(@RequestBody Stuff stuff) {
    //my logic here
}

이 방법으로이 엔드 포인트에서 POST를 수행하면 요청 본문의 JSON이 자동으로 내 모델로 역 직렬화됩니다 (Stuff). 문제는, 방금 들어오는 그대로의 원시 JSON을 로깅하라는 요구 사항이 있습니다! 나는 다른 접근법을 시도했다.

암호:

@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public OutputStuff createStuff(@RequestBody Stuff stuff, HttpServletRequest req) {
    StringBuilder sb = new StringBuilder();
    req.getReader().getLines().forEach(line -> {
        sb.append(line);
    });
    //log sb.toString();
    //my logic here
}

이 문제는 내가 이것을 실행할 때 독자의 InputStream이 이미 JSON을 desuffialize하여 Stuff으로 변환했음을 의미한다. 따라서 동일한 입력 스트림을 두 번 읽을 수 없으므로 오류가 발생합니다.

코드 (일부) :

public class RawRequestLoggerInterceptor extends HandlerInterceptorAdapter {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        StringBuilder sb = new StringBuilder();
        req.getReader().getLines().forEach(line -> {
            sb.append(line);
        });
        //log sb.toString();

        return true;
    }
}

이 tho의 문제는, 물건에의 직렬화가 일어날 때까지는, Request로부터의 InputStream가 벌써 읽혀 졌을 것입니다. 그래서 나는 다시 예외를 얻을 것이다.

더 나은 해결책이 있습니까, 언급하지 않았거나 알지 못하는 것입니까? 나는 도움을 감사 할 것입니다. SpringBoot의 최신 릴리스를 사용하고 있습니다.

해결법

  1. ==============================

    1.이 게시물에서 참조한대로 : HttpRequest 및 HttpResponse를 파일에 기록하는 방법?, spring은 요청을 기록하는 데 사용할 수있는 AbstractRequestLoggingFilter를 제공합니다.

    이 게시물에서 참조한대로 : HttpRequest 및 HttpResponse를 파일에 기록하는 방법?, spring은 요청을 기록하는 데 사용할 수있는 AbstractRequestLoggingFilter를 제공합니다.

    AbstractRequestLoggingFilter API 문서 (여기에서 찾을 수 있습니다.)

  2. ==============================

    2.또한 봄에 그렇게하려고했지만 체인에 내 사용자 지정 http 요청을 전달할 수있는 방법을 찾지 못했습니다. 그렇다면 체인에 내 사용자 지정 http 요청을 전달한 전통적인 j2ee 필터를 작성했습니다. http 요청을 두 번 이상 읽을 수 있음

    또한 봄에 그렇게하려고했지만 체인에 내 사용자 지정 http 요청을 전달할 수있는 방법을 찾지 못했습니다. 그렇다면 체인에 내 사용자 지정 http 요청을 전달한 전통적인 j2ee 필터를 작성했습니다. http 요청을 두 번 이상 읽을 수 있음

    이 예제를 확인하십시오 http://www.myjavarecipes.com/how-to-read-post-request-data-twice-in-spring/

  3. from https://stackoverflow.com/questions/32763922/spring-reading-request-body-twice by cc-by-sa and MIT license