为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Spring MVC 从 ExceptionHandler 获取请求值

使用 Spring MVC 从 ExceptionHandler 获取请求值

慕姐4208626 2021-10-13 14:05:21
我有一个 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);    }}异常处理程序:@ControllerAdvicepublic 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 回答

?
达令说

TA贡献1821条经验 获得超6个赞

那么请求正文在 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());

    }

}

希望这可以帮助


查看完整回答
反对 回复 2021-10-13
  • 1 回答
  • 0 关注
  • 591 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信