我从webservice返回了以下json字符串。 JAXB带注释的实体将如何看起来像?我的问题:json没有任何“外部”根元素。
{
"Header": "head",
"ProductIdentifier": "WLW",
"Version": "2"
}
// JAXB:
@XmlRootElement
class JsonVO {
private String header, productIdentifier, version;
//constructor, getter, setter
}
解组:
builder.get(JsonVO.class);
结果:
org.apache.cxf.jaxrs.utils.JAXRSUtils logMessageHandlerProblem
Schwerwiegend: No message body reader has been found for class com.craps.service.Reseed, ContentType: application/json
答案 0 :(得分:2)
使用JSON-P,您将无法直接将JSON响应绑定到JAXB带注释的bean。您可以使用MOXy执行此操作,我将其用于此目的。
首先,将MOXy依赖项添加到项目中。如果您使用Maven,则可以添加:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.1</version>
</dependency>
当您使用该服务时,请向您的客户注册MOXyJsonProvider:
client.register(MOXyJsonProvider.class);
默认情况下,MOXyJsonProvider支持没有root元素的JSON,因此您不需要任何其他配置。
答案 1 :(得分:0)
另一种解决方案是不使用Moxy。只需修改JSONProvider配置。
这是cxf配置文件
jaxrs:server id="KPService" address="/KPApp">
<jaxrs:serviceBeans>
<ref bean="kpBean" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<bean class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
<property name="dropRootElement" value="true" />
<property name="dropCollectionWrapperElement" value="false" />
<property name="ignoreNamespaces" value="true" />
<property name="convention" value="mapped"/>
<property name="unmarshallAsJaxbElement" value="true" />
<!-- <property name="writeXsiType" value="false" /> -->
<property name="readXsiType" value="false" />
</bean>
<ref bean="schemaGen"/>
</jaxrs:providers>
<jaxrs:features>
<cxf:logging />
</jaxrs:features>
</jaxrs:server>
<bean id="kpBean"
class="com.rest.KPResource"></bean>
<bean id="schemaGen" class="org.apache.cxf.jaxrs.model.wadl.WadlGenerator">
<property name="linkJsonToXmlSchema" value="true" />
<property name="schemaLocations">
<list>
<value>classpath:/json.schema</value>
</list>
</property>
<property name="useJaxbContextForQnames" value="true" />
<property name="ignoreMessageWriters" value="false" />
<property name="addResourceAndMethodIds" value="true" />
</bean>