超类访问检查失败:类 com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl

问题描述 投票:0回答:1

我在使用 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 请求时产生了问题

java spring soap spring-ws java-17
1个回答
0
投票

这可能是因为缺少依赖项。

<dependency>
    <groupId>com.sun.xml.messaging.saaj</groupId>
    <artifactId>saaj-impl</artifactId>
    <version>1.5.1</version>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.