Après avoir traîné pendant deux jours, j'ai trouvé la solution au problème. Vous pouvez utiliser la classe ObjectFactory pour contourner les classes qui n'ont pas @XmlRootElement . ObjectFactory a surchargé les méthodes pour l'enrouler autour de JAXBElement.
Méthode: 1 fait la création simple de l'objet.
Méthode: 2 enveloppera l'objet avec @JAXBElement .
Utilisez toujours la méthode: 2 pour éviter javax.xml.bind.MarshalException - avec une exception liée manquant une annotation @XmlRootElement.
Veuillez trouver l'exemple de code ci-dessous
Méthode: 1 fait la création simple de l'objet
public GetCountry createGetCountry() {
return new GetCountry();
}
Méthode: 2 enveloppera l'objet avec @JAXBElement .
@XmlElementDecl(namespace = "my/name/space", name = "getCountry")
public JAXBElement<GetCountry> createGetCountry(GetCountry value) {
return new JAXBElement<GetCountry>(_GetCountry_QNAME, GetCountry.class, null, value);
}
Exemple de code de travail:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
WebServiceTemplate springWSTemplate = context.getBean(WebServiceTemplate.class);
GetCountry request = new GetCountry();
request.setGuid("test_guid");
JAXBElement<GetCountryResponse> jaxbResponse = (JAXBElement<GetCountryResponse>)springWSTemplate .marshalSendAndReceive(new ObjectFactory().createGetCountry(request));
GetCountryResponse response = jaxbResponse.getValue();