Sau khi thử nghiệm hai ngày, tôi đã tìm ra giải pháp cho vấn đề này. Bạn có thể sử dụng lớp ObjectFactory để giải quyết cho các lớp không có @XmlRootEuity . ObjectFactory đã quá tải các phương thức để bọc nó xung quanh JAXBEuity.
Phương pháp: 1 thực hiện việc tạo đơn giản của đối tượng.
Phương thức: 2 sẽ bọc đối tượng bằng @JAXBEuity .
Luôn sử dụng Phương thức: 2 để tránh javax.xml.bind.MarshalException - với ngoại lệ được liên kết thiếu một chú thích @XmlRootEuity.
Vui lòng tìm mã mẫu bên dưới
Phương thức: 1 thực hiện đơn giản việc tạo đối tượng
public GetCountry createGetCountry() {
return new GetCountry();
}
Phương thức: 2 sẽ bọc đối tượng bằng @JAXBEuity .
@XmlElementDecl(namespace = "my/name/space", name = "getCountry")
public JAXBElement<GetCountry> createGetCountry(GetCountry value) {
return new JAXBElement<GetCountry>(_GetCountry_QNAME, GetCountry.class, null, value);
}
Mẫu mã làm việc:
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();