com.sun.istack.SAXException2: XXXX is not known to this context
近期一个需求,需要在一个 cfx+spring搭建的webService项目的一个功能中调用另外一个WebService项目中的两个接口,单独调用两个接口没有任何异常,但是同时调用两个接口就会报异常 org.apache.cxf.interceptor.Fault: Marshalling Error: XXXX is not known to this conte,同事帮助得以解决,做个例子特此留念.
服务端接口A:
-
@WebService -
public interface SayHello { -
public String sayHello(@WebParam(name = "name") String name); -
}
接口A实现类:
-
public class SayHelloImpl implements SayHello { -
@Resource -
private UserService userService; -
@Override -
public String sayHello(String name) { -
//User user = userService.findOne(Long.valueOf(id)); -
return "Hello:" + name; -
} -
}
服务端接口B:
-
@WebService -
public interface SayGoodBye { -
public String sayGoodBye(@WebParam(name = "name") String name); -
}
接口B实现类:
-
public class SayGoodByeImpl implements SayGoodBye { -
@Override -
public String sayGoodBye(String name) { -
return "bye:" + name; -
} -
}
spring配置文件:
-
<bean id="getSayHelloImpl" class="gc.web.ws.SayHelloImpl"></bean> -
<jaxws:endpoint id="getSayHelloService" implementor="#getSayHelloImpl" address="/getSayHelloService"></jaxws:endpoint> -
<bean id="getSayGoodByeImpl" class="gc.web.ws.SayGoodByeImpl"></bean> -
<jaxws:endpoint id="getSayGoodByeService" implementor="#getSayGoodByeImpl" address="/getSayGoodByeService"></jaxws:endpoint>
客户端调用:
-
public static void main(String[] args){ -
try { -
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); -
Client clientA = dcf.createClient("http://192.168.1.66:8080/groupClass/ws/getSayHelloService?wsdl"); -
Object[] resultA = clientA.invoke("sayHello", "Joker"); -
System.out.println("resultA===>" + resultA[0]); -
dcf = JaxWsDynamicClientFactory.newInstance(); -
Client clientB = dcf.createClient("http://192.168.1.66:8080/groupClass/ws/getSayGoodByeService?wsdl"); -
Object[] resultB = clientB.invoke("sayGoodBye", "Joker"); -
System.out.println("resultB===>" + resultB[0]); -
} catch (Exception e) { -
e.printStackTrace(); -
} -
}
得到的异常:
-
[INFO ] [08:43:33] org.apache.cxf.endpoint.dynamic.DynamicClientFactory - Created classes: gc.web.ws.ObjectFactory, gc.web.ws.SayHello, gc.web.ws.SayHelloResponse -
resultA===>Hello:Joker -
[INFO ] [08:43:35] org.apache.cxf.endpoint.dynamic.DynamicClientFactory - Created classes: gc.web.ws.ObjectFactory, gc.web.ws.SayGoodBye, gc.web.ws.SayGoodByeResponse -
[WARN ] [08:43:35] org.apache.cxf.phase.PhaseInterceptorChain - Interceptor for {http://ws.web.gc/}SayGoodByeImplService#{http://ws.web.gc/}sayGoodBye has thrown exception, unwinding now -
org.apache.cxf.interceptor.Fault: Marshalling Error: gc.web.ws.SayGoodBye is not known to this context -
at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:266) -
at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:237) -
at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:117) -
at org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68) -
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) -
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514) -
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423) -
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:324) -
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:277) -
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:297) -
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:283) -
at cms.web.util.ConnectWebService.main(ConnectWebService.java:129) -
Caused by: javax.xml.bind.MarshalException -
- with linked exception: -
[com.sun.istack.SAXException2: gc.web.ws.SayGoodBye is not known to this context -
javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context] -
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:326) -
at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251) -
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:95) -
at org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:617) -
at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:241) -
... 11 more -
Caused by: com.sun.istack.SAXException2: gc.web.ws.SayGoodBye is not known to this context -
javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context -
at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:247) -
at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:262) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:147) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:130) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:332) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:339) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:75) -
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494) -
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323) -
... 15 more -
Caused by: javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context -
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:613) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:144) -
... 21 more -
org.apache.cxf.interceptor.Fault: Marshalling Error: gc.web.ws.SayGoodBye is not known to this context -
at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:266) -
at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:237) -
at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:117) -
at org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68) -
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) -
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514) -
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423) -
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:324) -
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:277) -
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:297) -
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:283) -
at cms.web.util.ConnectWebService.main(ConnectWebService.java:129) -
Caused by: javax.xml.bind.MarshalException -
- with linked exception: -
[com.sun.istack.SAXException2: gc.web.ws.SayGoodBye is not known to this context -
javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context] -
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:326) -
at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251) -
at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:95) -
at org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:617) -
at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:241) -
... 11 more -
Caused by: com.sun.istack.SAXException2: gc.web.ws.SayGoodBye is not known to this context -
javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context -
at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:247) -
at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:262) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:147) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:130) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:332) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:339) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:75) -
at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494) -
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323) -
... 15 more -
Caused by: javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context -
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:613) -
at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:144) -
... 21 more
解决异常后的客户端代码:主要是重置上下文
-
public static void main(String[] args){ -
try { -
//在一个方法中连续调用多次WebService接口,每次调用前需要重置上下文 -
ClassLoader cl = Thread.currentThread().getContextClassLoader(); -
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); -
Client clientA = dcf.createClient("http://192.168.1.66:8080/groupClass/ws/getSayHelloService?wsdl"); -
Object[] resultA = clientA.invoke("sayHello", "Joker"); -
System.out.println("resultA===>" + resultA[0]); -
Thread.currentThread().setContextClassLoader(cl); -
dcf = JaxWsDynamicClientFactory.newInstance(); -
Client clientB = dcf.createClient("http://192.168.1.66:8080/groupClass/ws/getSayGoodByeService?wsdl"); -
Object[] resultB = clientB.invoke("sayGoodBye", "Joker"); -
System.out.println("resultB===>" + resultB[0]); -
} catch (Exception e) { -
e.printStackTrace(); -
} -
}
本文介绍了一种在连续调用多个WebService接口时出现的“gc.web.ws.SayGoodByeisnotknowntothiscontext”异常,并提供了解决方案。通过重置线程上下文类加载器,可以避免此类异常,确保接口调用成功。
340

被折叠的 条评论
为什么被折叠?



