Spring 如何编写一个使用两种不同类型对象但只有一个端点的服务?
如何编写一个使用两种不同类型对象但只有一个端点的服务 /hello是端点,我应该能够处理类Hello1和类Hello2,它们都有不同的参数Spring 如何编写一个使用两种不同类型对象但只有一个端点的服务?,spring,web-services,rest,spring-mvc,Spring,Web Services,Rest,Spring Mvc,如何编写一个使用两种不同类型对象但只有一个端点的服务 /hello是端点,我应该能够处理类Hello1和类Hello2,它们都有不同的参数 @CrossOrigin @ResponseStatus(HttpStatus.OK) @RequestMapping(value = "/hello", method = RequestMethod.POST) public BaseResponseDTO geteula(@RequestBody Hello1 request) {} @CrossOri
@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) {}
上面是我实际需要的…但它必须是一个端点
@CrossOrigin
-AFAIK,Spring没有任何这样的注释HttpServletRequest
作为参数注入到方法中,并将请求主体转换为两种类型之一。您必须根据请求中的内容确定主体的类型
编辑:
我看到Spring实际上引入了一个
@CrossOrigin
注释。我在#2上得到纠正。我认为不可能有两种方法对同一请求做出响应(相同的请求指的是相同的路由路径和相同的方法)
您可以做的是为“hello”POST请求创建一个条目,并创建一个DTO对象,其中包含
Hello1
的所有成员以及Hell2
的所有成员。在entry方法中,您编写代码来确定请求的类型,并分别进行回复 如果您真的想这样做,我想您可以从某个抽象类Hello
中插入Hello1
和Hello2
类,并将其用作参数。此外,您还应该利用Jackson@JsonSubTypes
和@JsonTypeInfo
注释。但在这种情况下,您还应该从客户机发送额外的属性,以便Jackson知道它应该实例化什么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应该包括定义为loveproperty=“type”
(您可以随意命名)的type属性:
你所说的
处理类Hello1和类Hello2是什么意思。您只需拥有一个控制器类,然后是两个不同的服务类Hello1和Hello2,并让控制器与它们对话。更新帖子。请验证。希望它是干净的,但我也觉得它很脏。还有别的办法吗?我没有服务调用时的位置句柄。我们可以在请求对象中使用java泛型吗?@LintoKA,这是什么意思?你能以身作则吗?
{"type" : "hello1", .....}