如何编写一个消耗2种不同类型对象但只有一个端点的服务?

时间:2017-07-06 05:48:19

标签: spring web-services rest spring-mvc

如何编写一个消耗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) {}

以上是我实际需要的......但它需要是一个终点。

3 个答案:

答案 0 :(得分:0)

  1. 请了解如何格式化代码;我为你做了。
  2. 什么是@CrossOrigin - AFAIK,Spring没有任何此类注释。
  3. 不要这样做:创建单独的方法。
  4. 如果由于某种原因,您的生活依赖于编写复杂的代码,您可以将HttpServletRequest作为参数注入您的方法,并将请求主体转换为两种类型之一。您必须根据请求中的某些内容确定主体的类型。

    修改: 事实上,我看到Spring引入了@CrossOrigin注释。我坚持认为#2。

答案 1 :(得分:0)

我认为有两种方法可以响应同一个请求(同一个请求我指的是相同的路由路径和相同的方法)。

您可以做的是为“hello”POST请求创建一个条目,并创建一个DTO对象,其中包含Hello1的所有成员以及Hell2的所有成员。在入口方法中,您编写代码以确定请求的类型,并分别执行回复。

答案 2 :(得分:0)

如果你真的想这样做,我想你可以从一些抽象类Hello1中包含你的Hello2Hello类,并将其用作参数。此外,您应该采取杰克逊@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", .....}