2015-02-25 1 views
0

Je ne connais pas très bien la configuration CXF. Ici, je rencontre une situation dans laquelle un objet (sous-classe) va être utilisé pour le client mais il ne le déclare pas dans Endpoint. Par exemple, il existe une super classe "SuperClass" et deux sous-classes "SubClassA" et "SubClassB". La méthode suivante est déclarée dans Endpoint:cxf jax-ws no complexType pour les sous-classes lors de l'utilisation de la méthode générique

public <T extends SuperClass> T search(Criteria criteria, ClassType type); 

Par conséquent, ces sous-classes ne figurent pas dans Endpoint et il fait que leur complexType manque dans wsdl. L'erreur indiquant qu'aucun type de lecture est demandé lorsque l'objet de la sous-classe est appelée depuis le client.

org.apache.cxf.interceptor.Fault: 
Could not determine how to read type: {http://model.fmchan.com}SubClassA 

et je voudrais donc ici que de chercher une solution pour ajouter ces sous-classes dans wsdl de manière à être appelé correctement sur le côté client.

Si elle est correctement configuré, les éléments suivants doivent figurer sur wsdl:

<xsd:complexType name="SubClassA"> 
    <xsd:sequence> 
     <xsd:element minOccurs="0" name="date" type="xsd:dateTime"/> 
    </xsd:sequence> 
</xsd:complexType> 

Ci-joint la configuration côté serveur pour votre référence.

<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> 

Nous vous remercions de votre aide à l'avance.

Répondre

0

La solution la plus simple que je propose est de créer une méthode fictive incluant les sous-classes A et B comme paramètres pour le point d'extrémité. Ce n'est probablement pas la meilleure solution et je cherche toujours un meilleur.