实体提供商选择

时间:2014-11-09 14:52:45

标签: java web-services jersey jax-rs jersey-2.0

如果我有两个这样的实体提供商

MyBean1MessageBodyWriter: @Produces("application/xml") with generic type Object
MyBean2MessageBodyWriter: @Produces("application/xml") with generic type Object

在序列化MyBean类时,首先使用哪些实体提供程序。 MyBean1MessageBodyWriterMyBean2MessageBodyWriter

@GET
@Produces("application/xml")
public MyBean getMyBean() {
    return new MyBean("Hello World!", 42);
}

我指的是这里给出的例子https://jersey.java.net/documentation/latest/message-body-workers

1 个答案:

答案 0 :(得分:0)

来自JAX-RS 2.0。规范

  
      
  1. 获取将映射到消息实体主体的对象。对于Response或子类的返回类型,该对象是entity属性的值,对于其他返回类型,它是返回的对象。

  2.   
  3. 确定回复的媒体类型

  4.   
  5. 选择支持对象和媒体的MessageBodyWriter个提供程序集   消息实体主体的类型。

  6.   
  7. 使用泛型类型的主键对选定的MessageBodyWriter提供程序进行排序,其中泛型类型是对象类的最近超类的提供程序首先排序,而辅助键是媒体类型。

  8.   
  9. 遍历已排序的MessageBodyWriter提供程序,并使用每个提供程序的isWriteable方法选择支持将映射到实体主体的对象的MessageBodyWriter。< / p>

  10.   
  11. 如果步骤5找到合适的MessageBodyWriter,则使用其writeTo方法将对象映射到实体主体。

  12.   
  13. 否则,服务器运行时必须生成一个生成InternalServerErrorExceptionWebApplicationException的子类,其状态设置为500,并且没有实体,客户端运行时必须生成{{1 }}

  14.   

所以看起来您的问题属于第5类。应该实施ProcessingException方法来消除两个作者的歧义。它仍然在这一点之后,它无法确定,我不确定接下来会发生什么。如果可以的话, 应该尝试区分歧义。

另外,我不确定,通过查看作者的名字,如果他们两个都要写isWritable类型。如果是这样的话,那似乎是一个问题。如果没有,那么您只需检查MyBean isWritable参数是否等于Class

MyBean.class