我想创建一个拦截器,按条件将值写入@RequestBody
。但是如何在春天调用@PostMapping
之前拦截?
@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
我的目标是检测是否存在任何查询参数,然后直接写入从Person
正文生成的POST
对象。
我知道我可以在servlet方法中轻松实现这一点。但这只是一个例子,我想将此逻辑全局应用于所有请求。因此,为了不必在每个POST
请求上重复相同的代码调用,我想让某种拦截器直接写入生成的对象(反射就可以了)。
@PostMapping
之前执行什么方法?也许有人可以联系那里?
答案 0 :(得分:1)
在spring中,messageConverters负责(取消)将json字符串序列化为对象。在你的情况下,这应该是MappingJackson2HttpMessageConverter。
您可以使用自己的实现覆盖它并覆盖read方法,如下所示:
@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注册而不是自己的自定义messageConverter,并覆盖configureMessageConverters方法。
无法在此尝试,但这应该有效!