2011-12-19 80 views
2

我从JBoss的4迁移一个古老的JAX-WS 2.1 Web服务到WebSphere 7来源返回类型JAX-WS Web服务大多数@WebMethod部件全部是这样的:与在WebSphere

@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并返回XML这样的StreamSource

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

JAXBContext jc = JAXBContext.newInstance(); 
Marshaller marshaller = jc.createMarshaller(); 
marshaller.marshal(someJaxBObjectHierarchy, byteArrayOutputStream); 

return new StreamSource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())); 

此Web服务运行在JBoss 4(与JAX-WS和JAXB库就好了)和GlassFish 3.1,但网络phere 7一直给我下面的错误我使用客户端对Web服务的任何时间:

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()

+0

我不确定解决方案是什么,但它听起来像是WebSphere 7中的一个错误。对于此用例,因为您正在返回一个'Source',JAX-WS实现不需要利用JAXB impl来执行捆绑。添加'@XmlSeeAlso(StreamSource.class)'与你想做的事情相反,因为它会强制引入JAXB,并且会抱怨'Source'类。 – 2011-12-19 20:15:49

+0

如果是这种情况,是否有办法关闭端点的JAXB? – faffy 2011-12-19 21:20:10

回答

2

javax.xml.transform.Source不是一个正常的JAX-WS服务端点接口(SEI)有效的返回类型。如果您想这样做(并且符合JAX-WS),则需要使用以javax.xml.ws.Provider实现的服务(请参阅相应的文档)。如果JBoss或GlassFish在普通SEI中支持Source作为参数或返回类型,那么这是一个专有扩展。

+0

我在想这件事,并且倾注了关于'@ WebService'的文档,但我还没有发现任何暗示它是无效返回类型的东西。你在哪里找到这个? (我可能只是盲目的) – faffy 2011-12-20 17:37:00

+0

JAX-WS 2.1规范的第3.4节定义了一个有效的SEI标准,即“所有方法参数和返回类型与JAXB 2.0 Java到XML模式映射定义兼容”,这就是在随后的章节中进一步解释事实证明,JAXB默认将javax.xml.transform.Source映射到xs:base64Binary。这是这个意图吗?JBoss和GlassFish是做什么的? – 2011-12-20 20:08:16

+0

就是这样!我改变了所有的端点,以返回类型的byte [](xs:base64Binary映射为字节),而不是'Source',并且一切正常。至于GlassFish和JBoss在做什么 - 我不知道! – faffy 2011-12-20 21:15:15