L'éditeur PHP Strawberry est là pour répondre à une question courante : pourquoi le service SOAP (jax-ws) s'arrête-t-il après un certain temps et lève-t-il une WebServiceTransportException : exception non autorisée lors de son utilisation sur le système d'exploitation Linux ? Ce problème peut être dû à des problèmes d'autorisation. Sous Linux, le service SOAP peut avoir besoin d'accéder à certains fichiers ou répertoires, mais ne dispose pas des autorisations suffisantes pour y accéder, ce qui entraîne l'arrêt du service. La solution à ce problème consiste à garantir que le service SOAP dispose des autorisations suffisantes pour accéder aux fichiers et répertoires requis. Ce problème peut être résolu en modifiant les autorisations des fichiers et des répertoires ou en garantissant que le service SOAP utilise un utilisateur disposant des autorisations suffisantes.
J'ai développé une application savon et j'envoie les demandes aux services requis. Le problème est qu'après un certain temps, une exception est levée :
Trace de pile :
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
Cette fonctionnalité fonctionne sous Windows mais sous Linux (rocky linux), elle cesse de fonctionner après un certain temps (5 à 10 minutes).
Voici ma configuration (certaines informations ont été modifiées, comme l'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(); } }
Voici mon client
@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(); } }
Ici, j'ajoute des propriétés pour faire confiance au certificat SSL du truststore
@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); }
J'ai eu ce problème il y a quelques années. D'après ce que j'ai compris, le problème vient de la version JDK. J'ai changé le JDK vers une autre version (Amazon Coretto) et tout a bien fonctionné.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!