Spring 如何编写一个使用两种不同类型对象但只有一个端点的服务?

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

如何编写一个使用两种不同类型对象但只有一个端点的服务

/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) {}
上面是我实际需要的…但它必须是一个端点

  • 请学习如何格式化代码;我是为你做的
  • 什么是
    @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应该包括定义为love
    property=“type”
    (您可以随意命名)的type属性:


    你所说的
    处理类Hello1和类Hello2是什么意思。您只需拥有一个控制器类,然后是两个不同的服务类Hello1和Hello2,并让控制器与它们对话。更新帖子。请验证。希望它是干净的,但我也觉得它很脏。还有别的办法吗?我没有服务调用时的位置句柄。我们可以在请求对象中使用java泛型吗?@LintoKA,这是什么意思?你能以身作则吗?
    
    {"type" : "hello1", .....}