Получить значения запроса из ExceptionHandler с помощью Spring MVC - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть контроллер Spring MVC и обработчик исключений.Когда возникает исключение, я хочу, чтобы обработчик исключений регистрировал все данные GET / POST, которые были отправлены в запросе.Как этого достичь?

Контроллер:

@Controller
@RequestMapping("/foo")
public class FooController {
    private final FooService fooService;

    @PostMapping("/bar")
    @ResponseBody
    public BarObject doSomething(@RequestBody final FooContext context) 
    {
        return fooService.doSomething(context);
    }
}

Обработчик исключений:

@ControllerAdvice
public class ExceptionController {

    private final Logger log = LoggerFactory.getLogger(ExceptionController.class);

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ErrorMessage handleException(final HttpServletRequest request, final Exception exception) {
        //Retrieve request data 
        //request.getQueryString() 
        // How to get POST data if we cannot access @RequestBody?)
        log.error(request.getRequestURI(), exception);
        return new ErrorMessage(request.getRequestURI(), exception.getLocalizedMessage());
}

1 Ответ

0 голосов
/ 26 сентября 2018

Ну, тело запроса находится в HttpServletRequest.

Вы можете получить доступ к телу запроса RAW, выполнив что-то вроде:

String body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));

из метода обработчика исключений.(с использованием Java 8).

Затем вы можете проанализировать строку тела как POJO.

РЕДАКТИРОВАТЬ

Было отмечено, что ответ Avobe делаетне работа.Это происходит потому, что когда тело анализируется (с помощью @RequestBody), поток HTTP-соединения закрывается, и, следовательно, тело запроса не может быть снова получено.Как бы то ни было, вы можете внедрить свойство непосредственно в httpRequest из вашего метода контроллера, а затем получить доступ к значению в вашем обработчике исключений:

@RestController
@RequestMapping(ApiVersion.V1.prefix)
public class BatchController {
    @PostMapping("/batch")
    public @ResponseBody BatchResponse runBatch(@RequestBody BatchRequest batchRequest, HttpServletRequest request) throws IOException {
        System.out.println(batchRequest.getName());
        request.setAttribute("batchRequest" , batchRequest);
        throw new IllegalArgumentException("Some error");
    }

    @ExceptionHandler(IllegalArgumentException.class)
    public @ResponseBody BatchResponse handle(HttpServletRequest request) {
        BatchRequest batchRequest = (BatchRequest) request.getAttribute("batchRequest");
        System.out.println("handling exception");
        return new BatchResponse(batchRequest.getName());
    }
}

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...