具有多个消费的一个端点的多个 HttpMessageConverter 对象

Multiple HttpMessageConverter objects for one endpoint having multiple consumes

假设我注册了 2 org.springframework.http.converter.HttpMessageConverter<T> 个对象:

  1. HttpMessageConverter<Foo> 将 HTTP 消息转换为 Foo.class 的实例并支持内容类型 "application/foo"
  2. HttpMessageConverter<Bar> 将 HTTP 消息转换为 Bar.class 的实例并支持内容类型 "application/bar"

我有下面的 Rest 端点,它同时使用了以上两个:

@RequestMapping(value = "/foobar", method = POST,
    consumes = {"application/foo", "application/bar"}
public String readFooBar(???){
    ...
}

“???”中的参数定义是什么,是Foo foo, Bar barObject canBeFooOrBar然后按照我的逻辑向下转换,还是其他?

简而言之,处理生成 2 个不同对象的 2 个单独 RequestMapping 消费的最简单方法是什么?

控制器方法与任何其他 Java 方法没有区别。如果一个方法有一个参数,但你想传递两种不同的对象类型(Foo,Bar),那么这些类型必须共享一个公共的超类型(并且 Object 不算,除非在非常特殊的情况下)。

Foo和Bar只会共享一个超类型,如果超类型有一个方法(doWork),并且这个方法在Foo和Bar中的实现包含了所有特殊的处理逻辑(如Runnable) .如果你需要在你的 Controller 方法中做 instance of,那么你应该有两个 Controller 方法,因为 Foo 和 Bar 是不相关的。这些是使用聚合类型的一般规则。

感谢 的精彩解释,我通过以下方式解决了我的问题:

@RequestMapping(value = "/foobar", method = POST,
    consumes = {"application/foo"}
public String readFoo(Foo foo){
    ...
}

@RequestMapping(value = "/foobar", method = POST,
    consumes = {"application/bar"}
public String readBar(Bar bar){
    ...
}