使用 Spring MVC 从 ExceptionHandler 获取请求值

我有一个 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());

}


慕姐4208626
浏览 592回答 1
1回答

达令说

那么请求正文在 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());    }}希望这可以帮助
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java