找不到Java类型的消息正文编写器,类bookInfoListType和MIME媒体类型application / xml

时间:2014-10-10 16:00:33

标签: java web-services rest jaxb jersey

我最近一直在浏览此错误的stackoverflow,而且我几乎无法在我去过的所有线程上找到解决方案。这就是我在这里发布此问题的原因。

问题是我在返回响应时说错了。这是我的XSD定义:

<xs:element name="bookInfoList">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="bookInfo" type="bookInfoType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="bookInfo" type="bookInfoType"/>

<xs:complexType name="bookInfoListType">
    <xs:sequence>
        <xs:element name="bookInfo" type="bookInfoType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="bookInfoType">
    <xs:sequence>
        <xs:element name="bookId" type="xs:string" minOccurs="1" maxOccurs="1"/>
        <!-- ... more elements !-->
    </xs:sequence>
</xs:complexType>

生成以下bookListInfoType

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "bookInfoListType", propOrder = {
    "bookInfo"
})
public class bookInfoListType {

    protected List<bookInfoType> bookInfo;

    public List<bookInfoType> getbookInfo() {
        if (bookInfo == null) {
            bookInfo = new ArrayList<bookInfoType>();
        }
        return this.bookInfo;
    }
}

但是当我尝试像

那样发送回复时
return Response.status(HttpStatus.SC_OK).entity(bookInfoListConverter.convert(wsContext, allBooks)).build();

我得到了上述错误。

在我的ObjectFactory中,我确实看到了

public bookInfoListType createbookInfoListType() {
    return new bookInfoListType();
}

这是我的REST方法:

@Path ("v1/storename/")
public class BookResource
{
    @GET
    @Path ("books/{book_id}/info.xml")
    @Produces (MediaType.APPLICATION_XML)
    public Response getBookInfoXML () {
        //business logic
        return Response.status(HttpStatus.SC_OK).entity(bookInfoListConverter.convert(wsContext, allBooks)).build();
    }
}

更不用说了,我在XSD中看到了另一个名为bookInfoList的JAXB生成类。他们的定义几乎完全相同(这是我怀疑可能是问题的一件事,但我的其他类似于遵循相同模式的工作正常)。

我仍在努力想知道最新情况,但我已经没有想法,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

  

以任意Java对象的形式从资源方法返回的实体可以由Jersey序列化为容器输出流作为指定的表示。当然,虽然JAX-RS实现确实为Java类型的大多数常见组合提供了默认支持,并且它是相应的线上表示格式,但JAX-RS实现不支持上述任何Java类型和任意表示的转换。默认格式。

     

对于您的应用程序使用的每种Java类型和内容类型组合(JAX-RS实现附带的默认提供程序不涵盖),您必须拥有一个知道如何处理组合的提供程序,因此您必须具有适当的MessageBodyWriterMessageBodyReader类(如果您需要,请参阅上面的链接以了解如何编写它们 - 您可能需要参考您正在使用的JAX-RS实现/版本的确切文档)。

话虽如此,我发现你的错误有点奇怪,因为Jersey已经包含对可以编组JAXB bean的实体提供者的默认支持。您可能希望将您的服务与教程(例如Using JAX-RS With JAXB)进行比较,以确保您发布的错误不是红色鲱鱼