Spring MVC Controller预处理请求体

时间:2013-03-13 20:41:43

标签: java spring spring-mvc request

我正在开发Spring REST API。在需求中,有2个POST请求具有相同的URL但请求体不同。由于Spring MVC必须具有跨控制器的唯一映射,因此我必须预先处理请求主体以映射到特定的POJO。

根据请求正文中的session_type,我必须将请求映射到特定的POJO(JSON - > JAVA POJO)。

例如,如果请求正文中的“session_type”为“typeX”,则请求应映射到ClassX POJO。如果请求正文中的“session_type”为“typeY”,则请求应映射到ClassY POJO。

如果有办法使用某种请求体注释来做到这一点?

4 个答案:

答案 0 :(得分:5)

如果要绑定typeXtypeY,那么您肯定需要2个处理程序。但是,为什么我们不使用param的{​​{1}}选项:

@RequestMapping

如果你需要一些准备工作(fe规范化params或手动执行模型绑定),那么你上面的方法可以与@RequestMapping(method = RequestMethod.POST, value = "/url", params = "session_type=typeX") public String handleTypeX(@RequestBody @ModelAttribute TypeX typeX){ //TODO implement } @RequestMapping(method = RequestMethod.POST, value = "/url", params = "session_type=typeY") public String handleTypeY(@RequestBody @ModelAttribute TypeY typeY){ //TODO implement } 结合使用,但请注意,@InitBinder需要精确的ULR规则以及处理程序中的@InitBinder个参数。

编辑:在Spring MVC中,不可能为精确URL 使用2个处理程序,即当method / URL / params / consume类型相同时。

因此我建议使用统一处理程序,您可以在其中检查必要的参数,然后手动转换为相应的类。为了找到必要的课程,我认为最好使用Strategy pattern

@ModelAttribute

这种方法不处理验证,有些事情被省略了,但我相信这可能会有所帮助。

答案 1 :(得分:0)

我认为您应该使用一种方法为两种类型创建控制器,并根据typeXtypeY调用所需的组件\方法。

答案 2 :(得分:0)

GET不应该有请求机构,或者至少如果它们有the server side isn't required to do anything with them。正如您所描述的那样,此API不是RESTful。

假设您不关心这一点,请尝试创建一个控制器方法,该方法接受TypeX和TypeY的父类,或者TypeX和TypeY都实现的接口,使用@SomethingMeaningfulToYou注释它,然后使用web argument method resolver实例化你想要的子类。

虽然这是一个破坏API的黑客攻击。

答案 3 :(得分:0)

  

有2个POST请求具有相同的URL但请求正文

对于RESTful接口,相同的URL应始终指示相同的资源。请求正文可能包含该资源的不同表示。您可以为两种不同的表示创建不同的HttpMessageContverter类。