Java 实体提供者选择

Java 实体提供者选择,java,web-services,jersey,jax-rs,jersey-2.0,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类时首先使用哪个实体提供程序。MyBean1MessageBodyWriter或MyBeanMessageBodyWriter 我

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

MyBean1MessageBodyWriter: @Produces("application/xml") with generic type Object
MyBean2MessageBodyWriter: @Produces("application/xml") with generic type Object
序列化MyBean类时首先使用哪个实体提供程序。MyBean1MessageBodyWriter或MyBeanMessageBodyWriter


我指的是这里给出的例子

来自JAX-RS2.0。规格

获取将映射到消息实体正文的对象。对于响应或子类的返回类型,对象是实体属性的值,对于其他返回类型,它是返回的对象

确定响应的媒体类型

选择支持对象和媒体的MessageBodyWriter提供程序集 消息实体正文的类型

使用泛型类型的主键对所选MessageBodyWriter提供程序进行排序,其中泛型类型为对象类的最近超类的提供程序将首先排序,而媒体类型的辅助键将排序

遍历已排序的MessageBodyWriter提供程序,并利用每个提供程序的isWriteable方法,选择支持将映射到实体体的对象的MessageBodyWriter

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

否则,服务器运行时必须生成generate InternalServerErrorException,这是WebApplicationException的一个子类,其状态设置为500,并且没有实体和客户端运行时必须生成ProcessingException

看来你的担忧属于第五位。应该实现iswriteable方法来消除两个编写器之间的歧义。在这一点之后,它仍然无法确定,我不确定接下来会发生什么。如果可以的话,你应该试着把歧义分开

此外,通过查看作者的姓名,我也不确定他们是否都要编写MyBean类型。如果是这样的话,这似乎是个问题。如果不是,那么只要在类参数等于MyBean.Class时签入iswriteable即可

@GET
@Produces("application/xml")
public MyBean getMyBean() {
    return new MyBean("Hello World!", 42);
}
public boolean isWriteable(Class<?> type, Type genericType,
                           Annotation annotations[], MediaType mediaType) {
    return type == MyBean.class;
}