我从一段时间以来一直在为肥皂客户工作,我仍然无法理解。
我有这个错误:
Exception in thread "main" java.lang.IllegalAccessError: tried to access field org.apache.cxf.staxutils.OverlayW3CDOMStreamWriter.isOverlaid from class org.apache.cxf.binding.soap.saaj.SAAJStreamWriter
at org.apache.cxf.binding.soap.saaj.SAAJStreamWriter.getPrefix(SAAJStreamWriter.java:79)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.java:109)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:87)
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:67)
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.invokeWrapped(ClientImpl.java:312)
at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:321)
at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:240)
at com.sigetel.web.web.rest.consumer.SoapClient.invoke(SoapClient.java:63)
at com.sigetel.web.web.rest.consumer.SoapClient.main(SoapClient.java:37)
Disconnected from the target VM, address: '127.0.0.1:60128', transport: 'socket'
Process finished with exit code 1
我看到它有点普遍,但仍然无法使其发挥作用。
这是我的代码:
Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE);
SOAPMessage response;
SOAPBody responseBody;
dispatch.getRequestContext().put(Dispatch.SOAPACTION_USE_PROPERTY, true);
dispatch.getRequestContext().put(Dispatch.SOAPACTION_URI_PROPERTY, soapActionUri);
try {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();
SOAPPart soapPart = message.getSOAPPart();
StreamSource msgSrc = new StreamSource(new StringReader(request));
soapPart.setContent(msgSrc);
message.saveChanges();
response = dispatch.invoke(message);
responseBody = response.getSOAPBody();
....
可能相关的相关依赖项:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.1.6</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
<version>1.6.11</version>
</dependency>
以及这些:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.1.11</version>
</dependency>
有关此错误的任何想法?
答案 0 :(得分:4)
您可能已经注意到,SAAJStreamWriter和OverlayW3CDOMStreamWriter版本不兼容。
SAAJStreamWriter
位于包cxf-rt-bindings-soap
中,由以下人员提供:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.1.11</version>
</dependency>
OverlayW3CDOMStreamWriter
位于pachage cxf-core
,由以下人员提供:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.1.6</version>
</dependency>
尝试使用最新版本的org.apache.cxf - 3.1.13或3.2.0 - 两个依赖项的相同版本。
答案 1 :(得分:3)
您正在提取OverlayW3CDOMStreamWriter
的错误版本。
SAAJStreamWriter
扩展OverlayW3CDOMStreamWriter
,其中包含isOverlaid
字段。
{3.2}版本中isOverlaid
已从包私有更改为受保护,并被反向移植到3.1.7版本,因此可以在子类SAAJStreamWriter
中访问
以下依赖关系都是拉动cxf核心,其中包含OverlayW3CDOMStreamWriter
1
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.1.11</version>
</dependency>
cxf-rt-frontend-jaxws - cxf-rt-bindings-soap - 3.1.11 for SAAJStreamWriter
cxf-rt-transports-http - cxf-core - 3.1.11 for OverlayW3CDOMStreamWriter
2
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.1.6</version>
</dependency>
cxf-rt-transports-http - cxf-core - 用于OverlayW3CDOMStreamWriter的3.1.6
cxf核心3.1.6是在3.1.11上选择的,因为它更接近,因为默认情况下maven解决了与最近获胜策略的版本冲突。
所以实质上3.1.11 SAAJStreamWriter
类期待3.1.11 OverlayW3CDOMStreamWriter
但是找到了3.1.6 OverlayW3CDOMStreamWriter
,其中isOverlaid
是包私有的,并且是你的错误。
修复更改为使用3.1.11进行jetty依赖或至少使用版本3.1.7进行上述两种依赖。
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.1.11</version>
</dependency>
这将为cxf核心和cxf绑定提取3.1.11
,并应解决错误。