2013-10-04 1 views
0

This post is the closest one to my problem. Cependant, il n'y a aucune explication là comment le problème a été résolu ou ce qui était vraiment mal avec lui.spring-ws jaxb pojo champs non peuplés/umarshalled

J'ai essayé une configuration très basique pour éliminer les problèmes sous-jacents.

Mon printemps-ws-context.xml est la suivante:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:sws="http://www.springframework.org/schema/web-services" 
    xmlns:oxm="http://www.springframework.org/schema/oxm" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-2.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.2.xsd"> 
<context:component-scan base-package="test" /> 

<sws:annotation-driven marshaller="marshaller" unmarshaller="marshaller" /> 

<sws:dynamic-wsdl id="person" portTypeName="Person" 
    locationUri="/personService/" targetNamespace="http://myschema/person/definitions"> 
    <sws:xsd location="classpath:person.xsd" /> 
</sws:dynamic-wsdl> 
<sws:interceptors> 
    <bean 
     class="org.springframework.ws.soap.server.endpoint.interceptor.SoapEnvelopeLoggingInterceptor"> 
     <property name="logRequest" value="true"></property> 
     <property name="logResponse" value="true"></property> 
    </bean> 
</sws:interceptors> 

<oxm:jaxb2-marshaller id="marshaller"> 
    <oxm:class-to-be-bound name="test.request.GetPersonRequest" /> 
</oxm:jaxb2-marshaller> 

Mon GetPersonRequest.java est ce

@XmlRootElement(name = "GetPersonRequest", namespace = PersonEndpoint.NAMESPACE_URI) 
@XmlAccessorType(XmlAccessType.FIELD) 
public class GetPersonRequest { 
    @XmlElement 
    private Integer id; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

} 

My Endpoint est la suivante:

@Endpoint 
public class PersonEndpoint { 

    public static final String NAMESPACE_URI = "http://myschema/person/schemas"; 

    @Autowired 
    PersonService service; 

    @PayloadRoot(namespace = NAMESPACE_URI, localPart="GetPersonRequest") 
    public @ResponsePayload GetPersonResponse handleGetPersonRequest(@RequestPayload Element request) { 
     System.out.println("handleGetPersonRequest()"); 
     // TODO: Go to service.getPerson(request) 
     return new GetPersonResponse(); 
    } 
} 

Je voudrais noter que à l'ensemble du service est opérationnel et fonctionne sans erreurs. C'est ce qui est correct jusqu'à présent (selon les instructions ci-dessus):

1) Endpoint peut afficher wsdl à soapui et navigateur.

2) soap xml peut être soumis sans erreur. 3) les fichiers journaux montrent que le corps XML a été envoyé.

Mais pour la vie de moi @RequestPayload GetPersonRequest demande est vide! Il n'a qu'un seul champ pour les chrissakes et il ne sera même pas réglé!

Maintenant, si je n'utilise pas JAXB comme objet de requête mais que j'utilise org.w3c.dom.Element à la place, je peux voir que toutes les données que j'ai soumises sont toutes là.

Qu'est-ce qui me manque? Je ne peux pas m'empêcher de penser qu'il me manque quelque chose de complètement simple.

C'est l'entrée de l'échantillon par la voie (au moins ce que les journaux montrent):

<sch1:GetPersonRequest xmlns:sch1="http://myschema/person/schemas"> 
    <sch1:id>1</sch1:id> 
    </sch1:GetPersonRequest> 
+0

vous pouvez ignorer la déclaration marhaller comme je l'ai ajouté plus tard à des fins de test – Chad

+0

D'accord c'est bizarre. Apparemment, déclarer explicitement l'espace de noms sur XmlElement résout le problème. Mais je pense que ça ne devrait pas être comme ça. J'ai travaillé sur un projet de savon simple et cela ne fait pas cela ou ne l'exige pas du tout. – Chad

Répondre

0

Je ne peux pas trouver une meilleure solution pour cela. Jusqu'à présent, la seule réponse que je peux trouver utilise un package-info.java

@javax.xml.bind.annotation.XmlSchema(namespace = test.ws.PersonEndpoint.NAMESPACE_URI, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package test.request; 

Mon ancien projet n'a pas utilisé ressort et EXIGE le fichier XSD pour avoir un attribut targetNamespace. Je voulais simplifier mon application actuelle en faisant avec les espaces de noms pour le moment mais il semble que ça ne marchera pas avec spring-ws.

Questions connexes