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

时间:2017-11-08 11:45:17

标签: java spring rest spring-mvc spring-web

我想创建一个拦截器,按条件将值写入@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之前执行什么方法?也许有人可以联系那里?

1 个答案:

答案 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方法。

无法在此尝试,但这应该有效!