JBOSS EAP 6.4: impossible d'utiliser le schéma HTTPS dans «soap: address» dans le WSDL généré
J'ai modifié ma configuration autonome pour utiliser le connecteur HTTPS avec le connecteur HTTP:
<subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" native="false">
<connector name="http" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="http" socket-binding="http"/>
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" secure="true">
<ssl name="https" key-alias="test" password="testpwd" certificate-key-file="testjkspath"/>
</connector>
<virtual-server name="default-host" enable-welcome-root="false">
<alias name="localhost"/>
<rewrite name="redirect_https" pattern="^.*/service/(.*)" substitution="https://host.domain.com:8443/service/$1" flags="L,R=301">
<condition name="condition-0" test="%{SERVER_PORT}" pattern="8080"/>
<condition name="condition-1" test="%{HTTPS}" pattern="off"/>
</rewrite>
</virtual-server>
</subsystem>
Avec cette configuration, je suis capable de transférer le trafic HTTP vers l'URL HTTPS. Ça fonctionne bien. J'ai aussi un webservice écrit en JAVA:
@Stateless
@WebService(targetNamespace = "http://app.domain.com/usecase/serv1")
public class TestInterface {
public ResultTO getResult(@WebParam(name = "getResultReq") final RequestRO getResultReq) {
// some logic here
}
}
Une fois l'application (service.ear) déployée, je peux voir le wsdl à:
https://host.domain.com:8443/service/wstest/TestInterface?wsdl
Mais la définition du service WSDL utilise l'URL HTTP à l'intérieur de l'élément "soap: address":
<wsdl:service name="TestInterfaceService">
<wsdl:port binding="tns:TestInterfaceServiceSoapBinding" name="TestInterfacePort">
<soap:address location="http://host:8080/service/wstest/TestInterface"/>
</wsdl:port>
</wsdl:service>
Mon service Web est accessible à partir des deux URL:
http://host:8080/service/wstest/TestInterface
et
https://host.domain.com:8443/service/wstest/TestInterface
Comment puis-je modifier l'URL générée à l'intérieur de l'élément "soap: address" dans le fichier WSDL généré?
J'ai essayé de changer la configuration du module de service Web dans XML autonome comme suit:
<subsystem xmlns="urn:jboss:domain:webservices:1.2">
<modify-wsdl-address>true</modify-wsdl-address>
<wsdl-host>host.domain.com</wsdl-host>
<wsdl-secure-port>8443</wsdl-secure-port>
<endpoint-config name="Standard-Endpoint-Config"/>
<endpoint-config name="Recording-Endpoint-Config">
<pre-handler-chain name="recording-handlers" protocol-bindings="##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM">
<handler name="RecordingHandler" class="org.jboss.ws.common.invocation.RecordingServerHandler"/>
</pre-handler-chain>
</endpoint-config>
</subsystem>
Après ce changement, WSDL affiche "soap: address" comme:
<wsdl:service name="TestInterfaceService">
<wsdl:port binding="tns:TestInterfaceServiceSoapBinding" name="TestInterfacePort">
<soap:address location="http://host.domain.com:8080/service/wstest/TestInterface"/>
</wsdl:port>
</wsdl:service>
Le port n'est pas modifié. Le schéma URI n'est pas non plus modifié en HTTPS. J'ai trouvé quelques threads SO ( thread1 , thread2 ) qui demandent d'ajouter l'attribut "wsdl-uri-scheme" à l'intérieur de la définition du service Web dans XML autonome. Mais n'est pas encore pris en charge par JBOSS EAP 6.4.
S'il vous plaît laissez-moi savoir si vous avez une idée sur la façon de procéder. Si vous avez besoin de plus d'informations, merci de me le faire savoir.
Réponses
J'ai enfin trouvé comment le faire fonctionner avec JBOSS EAP 6.4. Reportez-vous à cette base de connaissances RedHat .
Il existe plusieurs façons. J'ai suivi l'option 1 pour réécrire dynamiquement soap: address. Tout ce que vous avez à faire est d'utiliser wsdl-secure-port is webservice subsystem et de définir wsdl-host sur la valeur "jbossws.undefined.host":
<subsystem xmlns="urn:jboss:domain:webservices:1.2">
<modify-wsdl-address>true</modify-wsdl-address>
<wsdl-host>jbossws.undefined.host</wsdl-host>
<wsdl-secure-port>8443</wsdl-secure-port>
<endpoint-config name="Standard-Endpoint-Config"/>
<endpoint-config name="Recording-Endpoint-Config">
<pre-handler-chain name="recording-handlers" protocol-bindings="##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM">
<handler name="RecordingHandler" class="org.jboss.ws.common.invocation.RecordingServerHandler"/>
</pre-handler-chain>
</endpoint-config>
</subsystem>
Ensuite, WSDL a été généré avec soap: adresse comme:
https://host.domain.com:8443/service/wstest/TestInterface