spring Sping Boot 在使用@RequestBody时获取请求正文

nom7f22z  于 2022-12-10  发布在  Spring
关注(0)|答案(3)|浏览(208)

我使用 Boot 注解来访问请求主体属性,如下所示

@PostMapping
ResponseEntity<UserDto> createUser (@RequestBody UserDto userDto) {
    // some coode
    return null;
}

我想要做的不是仅仅访问userDto属性,而是记录整个请求主体,因为其他人正在使用发送请求,而它与我的userDto不匹配
我试过什么?

@PostMapping
ResponseEntity<UserDto> createUser (HttpServletRequest request) {
    logger.info("Body: {}", request.getReader().lines().collect(Collectors.toSet()));
    return null;
}

这样做很好,但是每次我想记录请求主体时,我必须在@RequestBody UserDtoHttpServletRequest request之间切换
有没有什么方法可以让我保留Jackson@RequestBody的annonation,同时仍然按原样记录请求主体?

lsmepo6l

lsmepo6l1#

信息取自https://www.baeldung.com/spring-http-logging
您可以为此使用Springs CommonsRequestLoggingFilter。您可以通过配置Bean激活它:

@Configuration
public class RequestLoggingFilterConfig {

    @Bean
    public CommonsRequestLoggingFilter logFilter() {
        CommonsRequestLoggingFilter filter           = new CommonsRequestLoggingFilter();
        filter.setIncludeQueryString(true);
        filter.setIncludePayload(true);
        filter.setMaxPayloadLength(10000);
        filter.setIncludeHeaders(false);
        filter.setAfterMessagePrefix("REQUEST DATA : ");
        return filter;
    }
}

过滤器记录调试,因此您需要为类启用调试日志记录。

<logger name="org.springframework.web.filter.CommonsRequestLoggingFilter">
    <level value="DEBUG" />
</logger>

有关参考,请参见https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/filter/CommonsRequestLoggingFilter.html

ct3nt3jp

ct3nt3jp2#

您可以使用fasterxml中的ObjectMapper
将以下依赖项添加到pom.xml:

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.3</version>
 </dependency>

将createUser方法更改为:

@PostMapping
ResponseEntity<UserDto> createUser (@RequestBody UserDto userDto)
throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    logger.info("Body: "+  objectMapper.writeValueAsString(userDto));
    return null;
}

在您的控制台中结果将是这样的:

: Body: {"name":"John","username":"Doe"}
wfauudbj

wfauudbj3#

解决此任务的一种方法是编写一个Http筛选器,在调用Handler方法之前记录消息。
Baeldung Article演示了一个记录日志的过滤器。

相关问题