com.sun.istack.SAXException2: XXXX is not known to this context

解决WebService调用异常
本文介绍了一种在连续调用多个WebService接口时出现的“gc.web.ws.SayGoodByeisnotknowntothiscontext”异常,并提供了解决方案。通过重置线程上下文类加载器,可以避免此类异常,确保接口调用成功。

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:

  1. @WebService

  2. public interface SayHello {

  3.  
  4. public String sayHello(@WebParam(name = "name") String name);

  5. }


接口A实现类:

  1. public class SayHelloImpl implements SayHello {

  2.  
  3. @Resource

  4. private UserService userService;

  5.  
  6. @Override

  7. public String sayHello(String name) {

  8. //User user = userService.findOne(Long.valueOf(id));

  9. return "Hello:" + name;

  10. }

  11. }


服务端接口B:

  1. @WebService

  2. public interface SayGoodBye {

  3.  
  4. public String sayGoodBye(@WebParam(name = "name") String name);

  5. }

接口B实现类:

  1. public class SayGoodByeImpl implements SayGoodBye {

  2. @Override

  3. public String sayGoodBye(String name) {

  4.  
  5. return "bye:" + name;

  6. }

  7. }


spring配置文件:

  1. <bean id="getSayHelloImpl" class="gc.web.ws.SayHelloImpl"></bean>

  2. <jaxws:endpoint id="getSayHelloService" implementor="#getSayHelloImpl" address="/getSayHelloService"></jaxws:endpoint>

  3.  
  4. <bean id="getSayGoodByeImpl" class="gc.web.ws.SayGoodByeImpl"></bean>

  5. <jaxws:endpoint id="getSayGoodByeService" implementor="#getSayGoodByeImpl" address="/getSayGoodByeService"></jaxws:endpoint>


客户端调用:

  1. public static void main(String[] args){

  2. try {

  3. JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();

  4. Client clientA = dcf.createClient("http://192.168.1.66:8080/groupClass/ws/getSayHelloService?wsdl");

  5. Object[] resultA = clientA.invoke("sayHello", "Joker");

  6. System.out.println("resultA===>" + resultA[0]);

  7.  
  8. dcf = JaxWsDynamicClientFactory.newInstance();

  9. Client clientB = dcf.createClient("http://192.168.1.66:8080/groupClass/ws/getSayGoodByeService?wsdl");

  10. Object[] resultB = clientB.invoke("sayGoodBye", "Joker");

  11. System.out.println("resultB===>" + resultB[0]);

  12. } catch (Exception e) {

  13. e.printStackTrace();

  14. }

  15. }


得到的异常:

  1. [INFO ] [08:43:33] org.apache.cxf.endpoint.dynamic.DynamicClientFactory - Created classes: gc.web.ws.ObjectFactory, gc.web.ws.SayHello, gc.web.ws.SayHelloResponse

  2. resultA===>Hello:Joker

  3. [INFO ] [08:43:35] org.apache.cxf.endpoint.dynamic.DynamicClientFactory - Created classes: gc.web.ws.ObjectFactory, gc.web.ws.SayGoodBye, gc.web.ws.SayGoodByeResponse

  4. [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

  5. org.apache.cxf.interceptor.Fault: Marshalling Error: gc.web.ws.SayGoodBye is not known to this context

  6. at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:266)

  7. at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:237)

  8. at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:117)

  9. at org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)

  10. at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)

  11. at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514)

  12. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423)

  13. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:324)

  14. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:277)

  15. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:297)

  16. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:283)

  17. at cms.web.util.ConnectWebService.main(ConnectWebService.java:129)

  18. Caused by: javax.xml.bind.MarshalException

  19. - with linked exception:

  20. [com.sun.istack.SAXException2: gc.web.ws.SayGoodBye is not known to this context

  21. javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context]

  22. at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:326)

  23. at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251)

  24. at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:95)

  25. at org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:617)

  26. at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:241)

  27. ... 11 more

  28. Caused by: com.sun.istack.SAXException2: gc.web.ws.SayGoodBye is not known to this context

  29. javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context

  30. at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:247)

  31. at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:262)

  32. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:147)

  33. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:130)

  34. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:332)

  35. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:339)

  36. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:75)

  37. at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494)

  38. at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323)

  39. ... 15 more

  40. Caused by: javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context

  41. at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:613)

  42. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:144)

  43. ... 21 more

  44. org.apache.cxf.interceptor.Fault: Marshalling Error: gc.web.ws.SayGoodBye is not known to this context

  45. at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:266)

  46. at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:237)

  47. at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:117)

  48. at org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)

  49. at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)

  50. at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514)

  51. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423)

  52. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:324)

  53. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:277)

  54. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:297)

  55. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:283)

  56. at cms.web.util.ConnectWebService.main(ConnectWebService.java:129)

  57. Caused by: javax.xml.bind.MarshalException

  58. - with linked exception:

  59. [com.sun.istack.SAXException2: gc.web.ws.SayGoodBye is not known to this context

  60. javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context]

  61. at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:326)

  62. at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251)

  63. at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:95)

  64. at org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:617)

  65. at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:241)

  66. ... 11 more

  67. Caused by: com.sun.istack.SAXException2: gc.web.ws.SayGoodBye is not known to this context

  68. javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context

  69. at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:247)

  70. at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:262)

  71. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:147)

  72. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:130)

  73. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:332)

  74. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:339)

  75. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:75)

  76. at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494)

  77. at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323)

  78. ... 15 more

  79. Caused by: javax.xml.bind.JAXBException: gc.web.ws.SayGoodBye is not known to this context

  80. at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:613)

  81. at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:144)

  82. ... 21 more

 

解决异常后的客户端代码:主要是重置上下文

  1. public static void main(String[] args){

  2. try {

  3. //在一个方法中连续调用多次WebService接口,每次调用前需要重置上下文

  4. ClassLoader cl = Thread.currentThread().getContextClassLoader();

  5.  
  6. JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();

  7. Client clientA = dcf.createClient("http://192.168.1.66:8080/groupClass/ws/getSayHelloService?wsdl");

  8. Object[] resultA = clientA.invoke("sayHello", "Joker");

  9. System.out.println("resultA===>" + resultA[0]);

  10.  
  11.   Thread.currentThread().setContextClassLoader(cl);

  12.  
  13. dcf = JaxWsDynamicClientFactory.newInstance();

  14. Client clientB = dcf.createClient("http://192.168.1.66:8080/groupClass/ws/getSayGoodByeService?wsdl");

  15. Object[] resultB = clientB.invoke("sayGoodBye", "Joker");

  16. System.out.println("resultB===>" + resultB[0]);

  17. } catch (Exception e) {

  18. e.printStackTrace();

  19. }

  20. }

<think>嗯,用户遇到了Java中程序包com.sun.istack.internal不存在的问题,我需要帮他们解决。首先,这个包属于com.sun的,通常不是公开API,可能在不同JDK版本或环境中不可用。 根据用户提供的引用内容,解决方案涉及Maven配置。比如引用1中提到在maven-compiler-plugin中添加bootclasspath,指向rt.jar和jce.jar。这可能是因为这些JAR在JRE目录下,而Maven编译时没有正确找到,所以需要显式指定。 另外,引用2提到使用system作用域引入依赖,但用户可能没有正确配置路径,或者路径不对。需要注意system作用域的依赖需要本地路径正确,否则其他开发者构建时会出问题。 还有一个可能性是JDK版本问题,比如用户可能使用较新的JDK版本,其中移除了某些内部类库。这时候可能需要降级JDK,或者寻找替代方案,比如使用其他公开的库替代com.sun的类。 另外,引用3提到缺少main类的问题,可能是在解决包缺失问题后,配置有误导致。需要确保在调整编译配置的同时,不破坏项目的其他部分,比如MANIFEST.MF中的主类配置。 用户可能需要分步骤的解决方案,比如首先检查JDK版本,然后调整Maven插件配置,或者排除依赖,或者使用替代库。还要考虑不同的情况,比如是否使用Maven,是否使用Spring Boot等。例如,Spring Boot打包成WAR时可能有不同的配置,需要特别处理。 另外,用户可能是在构建或打包时遇到这个问题,比如执行mvn compile或打包成WAR时。需要确保提供的解决方案适用于他们的构建工具和项目结构。 总结可能的解决方案:1. 调整Maven编译器插件的bootclasspath;2. 排除或替换依赖;3. 使用公开API替代;4. 检查JDK版本和环境变量;5. 处理IDE中的特定配置。需要详细说明每个步骤,并提醒用户注意潜在的问题,比如system作用域的限制,或者更换JDK版本的影响。 最后,生成相关问题,可能涉及其他内部包的问题,Maven配置优化,JDK版本兼容性等。</think>### 解决方案:Java程序包`com.sun.istack.internal`不存在的解决方法 #### 问题原因 `com.sun.istack.internal`是JDK内部的非公开API,不同版本的JDK可能移除或调整了相关类库[^2]。在Maven项目中,若未正确配置编译路径或依赖,会触发此错误。 --- #### 分步解决方案 1. **调整Maven编译器插件配置(推荐)** - 在`pom.xml`中添加`maven-compiler-plugin`配置,明确指定JDK的核心类库路径: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <compilerArguments> <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath> </compilerArguments> </configuration> </plugin> ``` 此配置强制Maven使用JDK的`rt.jar`和`jce.jar`解析内部类[^1]。 2. **检查JDK版本与环境变量** - 确认环境变量`JAVA_HOME`指向正确的JDK路径(如JDK 8)。 - 在IDE(如IntelliJ/Eclipse)中检查项目的`Project SDK`是否与`pom.xml`中配置的JDK版本一致。 3. **排除依赖或使用替代方案** - 若依赖库引用了`com.sun.istack.internal`,尝试升级依赖版本或联系维护者修复。 - 使用公开API替代内部类,例如替换`@NotNull`注解为`javax.annotation.Nonnull`。 4. **特殊场景:Spring Boot项目打包** - 若使用Spring Boot打包为WAR,需在`pom.xml`中显式声明`spring-boot-maven-plugin`,避免因类加载顺序导致问题[^2]: ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> ``` 5. **临时方案(慎用)** - 手动下载`rt.jar`并添加到项目依赖,但此方法可能导致环境依赖问题: ```xml <dependency> <groupId>com.sun.istack.internal</groupId> <artifactId>istack-commons-runtime</artifactId> <version>3.0.12</version> <scope>system</scope> <systemPath>${project.basedir}/lib/istack-commons-runtime.jar</systemPath> </dependency> ``` --- #### 验证步骤 1. 执行`mvn clean compile`检查编译是否通过。 2. 若仍有错误,运行`mvn dependency:tree`排查冲突依赖。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值