После двух дней работы я нашел решение проблемы. Вы можете использовать класс ObjectFactory , чтобы обойти классы, у которых нет @ XmlRootElement . ObjectFactory имеет перегруженные методы, чтобы обернуть его вокруг JAXBElement. Метод: 1 выполняет простое создание объекта, а Метод: 2 обернет объект с помощью @ JAXBElement . Всегда использовать Метод: 2 , чтобы избежать javax.xml.bind.MarshalException - со связанным исключением отсутствует аннотация @XmlRootElement
Метод: 1
public GetCountry createGetCountry() {
return new GetCountry();
}
Метод: 2
@XmlElementDecl(namespace = "my/name/space", name = "getCountry")
public JAXBElement<GetCountry> createGetCountry(GetCountry value) {
return new JAXBElement<GetCountry>(_GetCountry_QNAME, GetCountry.class, null, value);
}
Пример рабочего кода:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
WebServiceTemplate springWSTemplate = context.getBean(WebServiceTemplate.class);
GetCountry request = new GetCountry();
request.setGuid("1f3e1771-3049-49f5-95e6-dc3732c3227b");
JAXBElement<GetCountryResponse> jaxbResponse = (JAXBElement<GetCountryResponse>)springWSTemplate .marshalSendAndReceive(new ObjectFactory().createGetCountry(request));
GetCountryResponse response = jaxbResponse.getValue();