Dopo due giorni di ricerca ho trovato la soluzione al problema. Puoi usare la classe ObjectFactory per risolvere il problema delle classi che non hanno @XmlRootElement . ObjectFactory ha sovraccaricato i metodi per avvolgerlo attorno a JAXBElement.
Metodo: 1 esegue la semplice creazione dell'oggetto.
Metodo: 2 avvolgerà l'oggetto con @JAXBElement .
Usa sempre il metodo: 2 per evitare javax.xml.bind.MarshalException - con l'eccezione collegata mancante un'annotazione @XmlRootElement.
Di seguito è riportato il codice di esempio
Metodo: 1 esegue la semplice creazione dell'oggetto
public GetCountry createGetCountry() {
return new GetCountry();
}
Metodo: 2 avvolgerà l'oggetto con @JAXBElement .
@XmlElementDecl(namespace = "my/name/space", name = "getCountry")
public JAXBElement<GetCountry> createGetCountry(GetCountry value) {
return new JAXBElement<GetCountry>(_GetCountry_QNAME, GetCountry.class, null, value);
}
Esempio di codice funzionante:
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();