欢迎访问宙启技术站
智能推送

怎么在Spring MVC中打印@RequestBody、@Response日志

发布时间:2023-05-17 11:02:16

在Spring MVC中,@RequestBody和@ResponseBody注解分别用于处理请求和响应的数据,而打印日志则是一个用于调试和监控的重要手段。因此,如果我们想要查看@RequestBody和@ResponseBody的内容,就需要在Spring MVC中打印它们的日志。接下来,我们将从以下两个方面来介绍如何在Spring MVC中打印@RequestBody和@ResponseBody的日志。

1. 打印@RequestBody日志

为了打印@RequestBody的日志,我们需要自定义一个拦截器来拦截请求,并打印请求中的@RequestBody内容。下面是一个简单的示例:

首先,我们定义一个实现了HandlerInterceptor接口的拦截器类,如下:

public class RequestBodyLoggingInterceptor implements HandlerInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(RequestBodyLoggingInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (request.getMethod().equals(HttpMethod.GET.name())) {
            return true;
        }

        try (BufferedReader br = request.getReader()) {
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            logger.debug("@RequestBody: {}", sb.toString());
        }

        return true;
    }
}

其中,preHandle方法会在请求到达Controller之前被调用,我们在这里获取请求中的@RequestBody内容,并通过日志的方式进行输出。

然后,在Spring的配置文件中,我们需要将该拦截器注册到Spring MVC中。如下:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.example.RequestBodyLoggingInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

这里,我们设定了拦截器拦截所有的请求,并将RequestBodyLoggingInterceptor类注册到了Spring MVC中。

2. 打印@ResponseBody日志

打印@ResponseBody的日志相对来说比较简单,我们只需要在Controller方法上添加@ModelAttribute注解,然后通过日志输出即可。如下所示:

@RestController
@RequestMapping("/user")
public class UserController {

    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @GetMapping("/{userId}")
    public User getUserById(@PathVariable int userId) {
        return userService.getUserById(userId);
    }

    @PostMapping("/")
    public User createUser(@RequestBody User user, HttpServletResponse response) {
        try {
            User createdUser = userService.createUser(user);
            response.setStatus(HttpStatus.CREATED.value());
            return createdUser;
        } catch (Exception ex) {
            logger.error("Failed to create user: {}", user, ex);
            throw ex;
        }
    }

    @ModelAttribute
    public void setResponseHeader(HttpServletResponse response) {
        response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
    }
}

这里我们利用了@RestController注解来声明下面的UserController类是一个可以响应RESTful请求的控制器。在创建用户的请求中,我们通过日志的方式输出了@RequestBody内容。在设置响应头的方法上,我们添加了@ModelAttribute注解,并将响应内容的类型设置为了application/json。

以上就是如何在Spring MVC中打印@RequestBody和@ResponseBody的日志的方法。当我们需要查看请求和响应的具体内容时,这些方法会非常有用。