我在使用 spring-ws-core.3.1.1 时收到以下错误。除了我们升级了平台并要求我们使用 Java 17(之前的版本是基于 Java 11 构建的)之外,这一切都运行良好。这是调用外部服务的代码。
customerRequestType = buildCustomerRequest(customerModel);
ObjectFactory objectFactory = new ObjectFactory();
JAXBElement < CreateCustomerRequestType > jaxb = objectFactory.createCreateCustomerReques(customerRequestType);
JAXBElement < CreateCustomerResponseType > responseJaxb = (JAXBElement < CreateCustomerResponseType > ) customWebServiceTemplate.marshalSendAndReceive(jaxb);
CreateCustomerResponseType customerResponse = responseJaxb.getValue();
这是 Spring 的定义
<bean id="customWebServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<constructor-arg ref="clientMessageFactory" />
<property name="defaultUri" value="${vertex.service.create.customer.endpoint}" />
<property name="marshaller" ref="customerJaxbMarshaller" />
<property name="unmarshaller" ref="customerJaxbMarshaller" />
<property name="messageSender">
<bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
<property name="connectionTimeout" value="5000" />
<property name="readTimeout" value="5000" />
</bean>
</property>
</bean>
有复杂的逻辑什么的,在调用外部端点时,这是我在错误日志中看到的
"thrown": {
"localizedMessage": "superclass access check failed: class com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl (in unnamed module @0x7045bf72) cannot access class com.sun.org.apache.xerces.internal.dom.DocumentImpl (in module java.xml) because module java.xml does not export com.sun.org.apache.xerces.internal.dom to unnamed module @0x7045bf72",
"extendedStackTrace": [
{
"line": 106,
"class": "com.sun.xml.messaging.saaj.soap.SOAPPartImpl",
"file": "SOAPPartImpl.java",
"method": "<init>"
},
{
"line": 70,
"class": "com.sun.xml.messaging.saaj.soap.ver1_1.SOAPPart1_1Impl",
"file": "SOAPPart1_1Impl.java",
"method": "<init>"
},
{
"line": 96,
"class": "com.sun.xml.messaging.saaj.soap.ver1_1.Message1_1Impl",
"file": "Message1_1Impl.java",
"method": "getSOAPPart"
},
{
"line": 138,
"class": "org.springframework.ws.soap.saaj.SaajSoapMessage",
"file": "SaajSoapMessage.java",
"method": "getEnvelope"
},
{
"line": 38,
"class": "org.springframework.ws.soap.AbstractSoapMessage",
"file": "AbstractSoapMessage.java",
"method": "getSoapBody"
},
{
"line": 56,
"class": "org.springframework.ws.soap.AbstractSoapMessage",
"file": "AbstractSoapMessage.java",
"method": "getPayloadResult"
},
{
"line": 79,
"class": "org.springframework.ws.support.MarshallingUtils",
"file": "MarshallingUtils.java",
"method": "marshal"
},
{
"line": 402,
"class": "org.springframework.ws.client.core.WebServiceTemplate$2",
"file": "WebServiceTemplate.java",
"method": "doWithMessage"
},
{
"line": 572,
"class": "org.springframework.ws.client.core.WebServiceTemplate",
"file": "WebServiceTemplate.java",
"method": "doSendAndReceive"
},
{
"line": 542,
"class": "org.springframework.ws.client.core.WebServiceTemplate",
"file": "WebServiceTemplate.java",
"method": "sendAndReceive"
},
{
"line": 394,
"class": "org.springframework.ws.client.core.WebServiceTemplate",
"file": "WebServiceTemplate.java",
"method": "marshalSendAndReceive"
},
{
"line": 388,
"class": "org.springframework.ws.client.core.WebServiceTemplate",
"file": "WebServiceTemplate.java",
"method": "marshalSendAndReceive"
},
{
"line": 378,
"class": "org.springframework.ws.client.core.WebServiceTemplate",
"file": "WebServiceTemplate.java",
"method": "marshalSendAndReceive"
}
由于它是托管云环境,因此在编译代码或将任何其他参数传递给 JVM 时,我的选择有限。任何人都知道 RCA 是什么以及解决此问题的纠正措施是什么?
编辑 我能够获得有关错误的一些详细信息,这就是原始错误的样子
Method threw 'java.lang.IllegalAccessError' exception. Cannot evaluate org.springframework.ws.soap.saaj.SaajSoapMessage.toString()
这是由 Spring-WS 中的
MarshallingUtils
类抛出的。方法在这里
public static void marshal(Marshaller marshaller, Object graph, WebServiceMessage message) throws IOException {
if (marshaller instanceof MimeMarshaller && message instanceof MimeMessage) {
MimeMarshaller mimeMarshaller = (MimeMarshaller)marshaller;
MimeMessageContainer container = new MimeMessageContainer((MimeMessage)message);
mimeMarshaller.marshal(graph, message.getPayloadResult(), container);
} else {
marshaller.marshal(graph, message.getPayloadResult());
}
}
MimeMessageContainer container = new MimeMessageContainer((MimeMessage)message)
上面的行似乎在尝试构建 SOAP 请求时产生了问题
这可能是因为缺少依赖项。
<dependency>
<groupId>com.sun.xml.messaging.saaj</groupId>
<artifactId>saaj-impl</artifactId>
<version>1.5.1</version>
</dependency>