cxf jax-ws 使用泛型方法时子类没有复杂类型
cxf jax-ws no complexType for subclasses while using generic method
我对CXF配置不是很熟悉。这里我遇到一个情况,一个对象(subclass)将被用于客户端,但它没有在端点中声明。
例如,有一个超级class"SuperClass"和两个子class"SubClassA"和"SubClassB"。在 Endpoint 中声明了以下方法:
public <T extends SuperClass> T search(Criteria criteria, ClassType type);
因此,那些子classes 不会出现在 Endpoint 中,这导致它们的 complexType 在 wsdl 中丢失。 client.
调用subclass的object时提示no read type的错误
org.apache.cxf.interceptor.Fault:
Could not determine how to read type: {http://model.fmchan.com}SubClassA
所以在这里我想寻求一种解决方案,将这些子classes添加到wsdl中,以便在客户端正确调用。
如果配置正确,wsdl 上应该显示如下:
<xsd:complexType name="SubClassA">
<xsd:sequence>
<xsd:element minOccurs="0" name="date" type="xsd:dateTime"/>
</xsd:sequence>
</xsd:complexType>
附上服务器端的配置,供大家参考。
<import resource="classpath:META-INF/cxf/cxf.xml" />
<bean id="aegisContext" class="org.apache.cxf.aegis.AegisContext"
p:writeXsiTypes="true" scope="prototype" />
<bean id="aegisBean" p:aegisContext-ref="aegisContext"
class="org.apache.cxf.aegis.databinding.AegisDatabinding"
scope="prototype" />
<bean id="genericServiceImpl" class="com.fmchan.service.SomeEndpointImpl"/>
<jaxws:endpoint implementor="#genericServiceImpl"
address="${service.address}">
<jaxws:serviceFactory>
<ref bean="jaxws-and-aegis-service-factory" />
</jaxws:serviceFactory>
</jaxws:endpoint>
<bean id="jaxws-and-aegis-service-factory"
class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"
scope="prototype">
<property name="dataBinding">
<bean class="org.apache.cxf.aegis.databinding.AegisDatabinding" />
</property>
</bean>
提前感谢您的帮助。
我想到的最简单的解决方案是创建一个虚拟方法,包括那些子类 A 和 B 作为端点的参数。这可能不是最好的解决方案,我仍在寻找更好的解决方案。
我对CXF配置不是很熟悉。这里我遇到一个情况,一个对象(subclass)将被用于客户端,但它没有在端点中声明。
例如,有一个超级class"SuperClass"和两个子class"SubClassA"和"SubClassB"。在 Endpoint 中声明了以下方法:
public <T extends SuperClass> T search(Criteria criteria, ClassType type);
因此,那些子classes 不会出现在 Endpoint 中,这导致它们的 complexType 在 wsdl 中丢失。 client.
调用subclass的object时提示no read type的错误org.apache.cxf.interceptor.Fault:
Could not determine how to read type: {http://model.fmchan.com}SubClassA
所以在这里我想寻求一种解决方案,将这些子classes添加到wsdl中,以便在客户端正确调用。
如果配置正确,wsdl 上应该显示如下:
<xsd:complexType name="SubClassA">
<xsd:sequence>
<xsd:element minOccurs="0" name="date" type="xsd:dateTime"/>
</xsd:sequence>
</xsd:complexType>
附上服务器端的配置,供大家参考。
<import resource="classpath:META-INF/cxf/cxf.xml" />
<bean id="aegisContext" class="org.apache.cxf.aegis.AegisContext"
p:writeXsiTypes="true" scope="prototype" />
<bean id="aegisBean" p:aegisContext-ref="aegisContext"
class="org.apache.cxf.aegis.databinding.AegisDatabinding"
scope="prototype" />
<bean id="genericServiceImpl" class="com.fmchan.service.SomeEndpointImpl"/>
<jaxws:endpoint implementor="#genericServiceImpl"
address="${service.address}">
<jaxws:serviceFactory>
<ref bean="jaxws-and-aegis-service-factory" />
</jaxws:serviceFactory>
</jaxws:endpoint>
<bean id="jaxws-and-aegis-service-factory"
class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"
scope="prototype">
<property name="dataBinding">
<bean class="org.apache.cxf.aegis.databinding.AegisDatabinding" />
</property>
</bean>
提前感谢您的帮助。
我想到的最简单的解决方案是创建一个虚拟方法,包括那些子类 A 和 B 作为端点的参数。这可能不是最好的解决方案,我仍在寻找更好的解决方案。