Working with a SOAP API with Spring Boot WS. I was getting the following error trying to create the request.
1 |
com.sun.istack.SAXException2: unable to marshal type "com.ur-ban.GetSubscriptioninfo" as an element because it is missing an @XmlRootElement annotation |
I was originally directly using the JAXB generated classes to form my requests:
1 2 3 4 5 6 |
GetSubscriptioninfo subscriptionInfo = new GetSubscriptioninfo(); subscriptionInfo.setSubscriptionId(1); GetSubscriptioninfoResponse subscriptionInfoResponse = (GetSubscriptioninfoResponse) getWebServiceTemplate() .marshalSendAndReceive("http://www.ur-ban.com/subscription", subscriptionInfo); |
The correct way is to use the provided JAXB ObjectFactory
:
1 2 3 4 5 6 7 |
ObjectFactory objectFactory = new ObjectFactory(); GetSubscriptioninfo subscriptionInfo = objectFactory.createGetSubscriptioninfo(); subscriptionInfo.setSubscriptionId(1); GetSubscriptioninfoResponse subscriptionInfoResponse = (GetSubscriptioninfoResponse) getWebServiceTemplate() .marshalSendAndReceive("http://www.ur-ban.com/subscription", subscriptionInfo); |
But to prevent marshalling errors you need to wrap your object in a JAXBElement
object:
1 2 3 4 5 6 7 8 9 |
ObjectFactory objectFactory = new ObjectFactory(); GetSubscriptioninfo subscriptionInfo = objectFactory.createGetSubscriptioninfo(); subscriptionInfo.setSubscriptionId(1); JAXBElement<GetSubscriptioninfo> jaxbGetSubscriptionInfo = objectFactory.createGetSubscriptioninfo(subscriptionInfo); GetSubscriptioninfoResponse subscriptionInfoResponse = (GetSubscriptioninfoResponse) getWebServiceTemplate() .marshalSendAndReceive("http://www.ur-ban.com/subscription", jaxbGetSubscriptionInfo); |