我正在开发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。
如果有办法使用某种请求体注释来做到这一点?
答案 0 :(得分:5)
如果要绑定typeX
和typeY
,那么您肯定需要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)
我认为您应该使用一种方法为两种类型创建控制器,并根据typeX
或typeY
调用所需的组件\方法。
答案 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
类。