如何编写一个消耗2种不同类型对象但只有一个端点的服务?
/ hello是我应该能够处理类Hello1和类Hello2的端点......两者都有不同的参数。
@CrossOrigin
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/hello", method = RequestMethod.POST)
public BaseResponseDTO geteula(@RequestBody Hello1 request) {}
@CrossOrigin
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/hello", method = RequestMethod.POST)
public BaseResponseDTO geteula(@RequestBody Hello2 request) {}
以上是我实际需要的......但它需要是一个终点。
答案 0 :(得分:0)
@CrossOrigin
- AFAIK,Spring没有任何此类注释。如果由于某种原因,您的生活依赖于编写复杂的代码,您可以将HttpServletRequest
作为参数注入您的方法,并将请求主体转换为两种类型之一。您必须根据请求中的某些内容确定主体的类型。
修改强>:
事实上,我看到Spring引入了@CrossOrigin
注释。我坚持认为#2。
答案 1 :(得分:0)
我认为有两种方法可以响应同一个请求(同一个请求我指的是相同的路由路径和相同的方法)。
您可以做的是为“hello”POST请求创建一个条目,并创建一个DTO对象,其中包含Hello1
的所有成员以及Hell2
的所有成员。在入口方法中,您编写代码以确定请求的类型,并分别执行回复。
答案 2 :(得分:0)
如果你真的想这样做,我想你可以从一些抽象类Hello1
中包含你的Hello2
和Hello
类,并将其用作参数。此外,您应该采取杰克逊@JsonSubTypes
和@JsonTypeInfo
注释的优势。但在这种情况下,您还应该从您的客户端发送其他属性,以便杰克逊知道它应该实例化的exaclty实现类。例如:
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Hello1.class, name = "hello1"),
@JsonSubTypes.Type(value = Hello2.class, name = "hello2")
})
public abstract class Hello {
...
}
然后用你的类扩展这个类:
public class Hello1 extends Hello {
...
}
public class Hello2 extends Hello {
...
}
你的控制器:
@CrossOrigin
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/hello", method = RequestMethod.POST)
public BaseResponseDTO geteula(@RequestBody Hello request) {
if (request instanceof Hello1) {
// some logic
}
if (request instanceof Hello2) {
// some logic
}
...
}
请注意,在这种情况下,您的JSON应该包含已定义的类型属性ablove property = "type"
(您可以随意命名):
{"type" : "hello1", .....}