Веб-сервис JAX-WS с типом возврата источника в Websphere - PullRequest
2 голосов
/ 19 декабря 2011

Я переношу старый веб-сервис 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()

1 Ответ

2 голосов
/ 20 декабря 2011

javax.xml.transform.Source не является допустимым типом возврата для обычного интерфейса конечной точки службы JAX-WS (SEI).Если вы хотите сделать это (и быть совместимым с JAX-WS), вам нужно использовать сервис, который реализован как javax.xml.ws.Provider (см. Соответствующие документы).Если JBoss или GlassFish поддерживают Source в качестве параметра или типа возврата в обычном SEI, то это проприетарное расширение.

...