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>
vous pouvez ignorer la déclaration marhaller comme je l'ai ajouté plus tard à des fins de test – Chad
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