我开发了一个肥皂应用程序,并向所需的服务发送请求。问题是一段时间后抛出异常:
堆栈跟踪:
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);
}
几年前我遇到过这样的问题。据我了解,问题出在 JDK 版本上。我将 JDK 更改为另一个版本 (Amazon Coretto),一切正常。