我最近一直在浏览此错误的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生成类。他们的定义几乎完全相同(这是我怀疑可能是问题的一件事,但我的其他类似于遵循相同模式的工作正常)。
我仍在努力想知道最新情况,但我已经没有想法,任何帮助都会受到赞赏。
答案 0 :(得分:0)
以任意Java对象的形式从资源方法返回的实体可以由Jersey序列化为容器输出流作为指定的表示。当然,虽然JAX-RS实现确实为Java类型的大多数常见组合提供了默认支持,并且它是相应的线上表示格式,但JAX-RS实现不支持上述任何Java类型和任意表示的转换。默认格式。
对于您的应用程序使用的每种Java类型和内容类型组合(JAX-RS实现附带的默认提供程序不涵盖),您必须拥有一个知道如何处理组合的提供程序,因此您必须具有适当的MessageBodyWriter
和MessageBodyReader
类(如果您需要,请参阅上面的链接以了解如何编写它们 - 您可能需要参考您正在使用的JAX-RS实现/版本的确切文档)。
话虽如此,我发现你的错误有点奇怪,因为Jersey已经包含对可以编组JAXB bean的实体提供者的默认支持。您可能希望将您的服务与教程(例如Using JAX-RS With JAXB)进行比较,以确保您发布的错误不是红色鲱鱼