Я переношу старый веб-сервис JAX-WS 2.1 с JBoss 4 на Websphere 7. Большинство компонентов @WebMethod
выглядят так:
@WebMethod
public Source someMethod(){
Source source = null;
try{
source = ServiceActions.someMethodWorker();
}
catch( Throwable throwable ){
source = ServiceActions.handleThrowable("Error occured in method someMethod", throwable );
}
return source;
}
ServiceActions.someMethodWorker()
обычно выключается и получаетэти данные заполняют структуру JAXB, маршаллизируются в XML и возвращают StreamSource
XML следующим образом:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
JAXBContext jc = JAXBContext.newInstance();
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(someJaxBObjectHierarchy, byteArrayOutputStream);
return new StreamSource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
Этот веб-сервис прекрасно работает на JBoss 4 (с библиотеками Jax-WS и JaxB)и GlassFish 3.1, но Websphere 7 постоянно выдает мне следующую ошибку каждый раз, когда я использую клиент для веб-службы:
javax.xml.ws.soap.SOAPFaultException: javax.xml.bind.MarshalException
- with linked exception:
[javax.xml.bind.JAXBException: class javax.xml.transform.stream.StreamSource nor any of its super class is known to this context.]
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:111)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
На первый взгляд это кажется проблемой связывания типа JAXB;тем не менее, я добавил @XmlSeeAlso(StreamSource.class)
везде и все еще получаю ошибку.
Кто-нибудь знает, почему это не работает в WebSphere 7?
Спасибо!
Правка / Решение: Решение состоит в том, чтобы использовать byte[]
тип возврата вместо Source
GlassFish и JBoss делали что-то дополнительное по сравнению со спецификацией JAX-WS, что заставило меня поверить, чтоSource
возвращаемый тип был в порядке.
Вместо моих методов, возвращающих new StreamSource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()))
, они теперь просто возвращают byteArrayOutputStream.toByteArray()