为什么 SOAP 服务 (jax-ws) 在 Linux 操作系统上在一段时间后停止并抛出 WebServiceTransportException: Unauthorized [401]]?

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

我开发了一个肥皂应用程序,并向所需的服务发送请求。问题是一段时间后抛出异常:

堆栈跟踪:

Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed: org.springframework.ws.client.WebServiceTransportException: Unauthorized [401]] with root cause

org.springframework.ws.client.WebServiceTransportException: Unauthorized [401]
    at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:665) ~[spring-ws-core-4.0.2.jar!/:na]
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:587) ~[spring-ws-core-4.0.2.jar!/:na]
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:538) ~[spring-ws-core-4.0.2.jar!/:na]
    at 

该功能在 Windows 中有效,但在 Linux (Rocky Linux) 中,它会在一段时间(5-10 分钟)后停止工作。

这是我的配置(一些信息被更改,如 URL):

@Configuration
@RequiredArgsConstructor
public class CustomerPaymentClientConfig {

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("com.example.wsdl");
        return marshaller;
    }

    @Bean
    public WebServiceTemplate webServiceTemplate(WebServiceTemplateBuilder builder, Jaxb2Marshaller marshaller) throws Exception {

        return builder
                .setDefaultUri("https://service.example.com/WebPortalVC/PaymentWS")
                .setMarshaller(marshaller)
                .setUnmarshaller(marshaller)
                .build();
    }
}

这是我的客户

@Service
@RequiredArgsConstructor
public class GPPPaymentClient extends WebServiceGatewaySupport {
    private final WebServiceTemplate webServiceTemplate;
    private final Jaxb2Marshaller marshaller;

    public InitiatePaymentResponse InitiatePayment(MessageHeader messageHeader, InitiatePayment InitiationRequest) {

        JAXBElement<InitiatePaymentResponse> object = (JAXBElement<InitiatePaymentResponse>) webServiceTemplate.marshalSendAndReceive(InitiationRequest, webServiceMessage -> {
            try {
                String namespaceSer = "http://services.ws.payment.example.net/";
                SoapMessage soapMessage = (SoapMessage) webServiceMessage;
                SoapHeader header = soapMessage.getSoapHeader();
                header.addNamespaceDeclaration("ser", namespaceSer);

                ObjectFactory objectFactory = new ObjectFactory();
                MessageHeader soapHeader = objectFactory.createMessageHeader();
                soapHeader.setUserID(messageHeader.getUserID());
                soapHeader.setReceiverID(messageHeader.getReceiverID());
                soapHeader.setTransactionID(messageHeader.getTransactionID());
                soapHeader.setMessageDateTime(messageHeader.getMessageDateTime());
                JAXBElement<MessageHeader> headerElement = new JAXBElement<>(new QName("http://services.ws.payment.example.net/", "messageHeader"), MessageHeader.class, null, soapHeader);
                marshaller.marshal(headerElement, header.getResult());
                JAXBElement<InitiatePayment> bodyElement = new JAXBElement<>(new QName("http://test.ws.payment.example.net/", "InitiatePayment"), InitiatePayment.class, null, InitiationRequest);
                marshaller.marshal(bodyElement, soapMessage.getPayloadResult());

            } catch (Exception e) {
                log.info(e.toString());
            }
        });
        return object.getValue();
    }
}

在这里,我添加属性以信任来自信任库的 ssl 证书

@Bean
public void addProperties() {
    System.setProperty("javax.net.ssl.keyStore", keyStoreLocation);
    System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword);
    System.setProperty("javax.net.ssl.trustStore", cacertLocation);
    System.setProperty("javax.net.ssl.trustStorePassword", cacertPassword);
}
java jax-ws spring-ws
1个回答
1
投票

几年前我遇到过这样的问题。据我了解,问题出在 JDK 版本上。我将 JDK 更改为另一个版本 (Amazon Coretto),一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.