gpt4 book ai didi

java - 如何在调用@PostMapping 之前访问@RequestBody?

转载 作者:行者123 更新时间:2023-11-30 10:23:13 25 4
gpt4 key购买 nike

我想创建一个拦截器,根据条件将值写入 @RequestBody。但是我怎样才能在 @PostMapping 被 spring 调用之前拦截呢?

@RestController
public class PersonServlet {
@PostMapping("/person")
public void createPerson(@RequestBody Person p) {
//business logic
}

class Person {
String firstname, lastname;
boolean getQueryParamPresent = false;
}
}

然后我发送 POST 正文:

{
"firstname": "John",
"lastname": "Doe"
}

到网址:localhost:8080?_someparam=val

我的目标是检测是否存在任何查询参数,然后直接写入从 POST 主体生成的 Person 对象。

我知道我可以在 servlet 方法中轻松实现这一点。但是因为这只是一个示例,所以我想将此逻辑全局应用于所有 请求。因此,为了不必对每个 POST 请求重复相同的代码调用,我希望有某种拦截器直接写入生成的对象(反射会很好)。

但是:这可能吗? spring 在@PostMapping 之前执行了什么方法?也许有人可以在那里 Hook ?

最佳答案

在 Spring ,messageConverters 负责将 json 字符串(反)序列化为对象。在您的情况下,这应该是 MappingJackson2HttpMessageConverter。

您可以用自己的实现覆盖它并像这样覆盖读取方法:

@Service
public class MyMessageConverter extends MappingJackson2HttpMessageConverter

@Autowired Provider<HttpServletRequest> request;

@Override
public Object read(Type type, @Nullable Class<?> contextClass, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
Object result = super.read(type, contextClass, inputMessage);
if (result instanceof Person) {
HttpServletRequest req = request.get();
// Do custom stuff with the request variables here...
}
}

您可以通过实现自己的 WebMvcConfigurer 并覆盖 configureMessageConverters 方法来注册自己的自定义 messageConverter。

无法在这里尝试,但这应该可以!

关于java - 如何在调用@PostMapping 之前访问@RequestBody?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47178884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com