Marshalling Error: 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();
		}
	}


  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值