Glassfish anular generada WSDL Punto final de servicio Dirección
-
22-09-2019 - |
Pregunta
Tengo un servicio web generado por wsgen través experta. Cuando puedo implementar el servicio de Glassfish coloca la URL del servidor en el WSDL. Nuestro servidor Glassfish es liderada por un servidor proxy de Apache.
Lo que esto significa es cuando alguien accede a nuestra WSDL y miradas en el extremo de servicio y la ubicación de la dirección de jabón que ven es
http://app server url/service...
en lugar de
http://proxy server url/service...
Me parece que necesito algunas aclaraciones sobre algunos artículos ...
-
Es importante que esta dirección de punto final? Serán los clientes todavía será capaz de funcionar si la dirección de punto final no coincide con la dirección URL del servidor proxy que estarán llamando a invocar el servicio. Esto básicamente hace las preguntas " es WSDL para el servicio web como interfaz es objeto ".
ACTUALIZACIÓN: En respuesta a esta primera pregunta sí parece que " WSDL para el servicio web como interfaz es objeto ". La dirección de punto final especificado en el WSDL no es importante. De hecho, es relativamente trivial para invocar una operación de servicio web en un punto final diferente de la especificada en el WSDL como se describe aquí .
// Create service and proxy from the generated Service class. HelloService service = new HelloService(); HelloPort proxy = service.getHelloPort();
// Override the endpoint address ((BindingProvider)proxy).getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://new/endpointaddress"); proxy.sayHello("Hello World!");
-
El WSDL se genera automáticamente cuando hacemos uso de Glassfish. ¿Hay una manera fácil de anular esta dirección de punto final generado en Glassfish a través de un entorno de servidor de aplicaciones. Si es así, puedo crear un entorno para colocar automáticamente la dirección URL del servidor proxy en el WSDL generado.
Si 1 es realmente importante y no podemos anularlo en cualquier forma con 2, a continuación, que básicamente significa que tendremos que hacer construye separada para el desarrollo y la producción. Esto no se "siente bien", ya que me parece que lo único que hay que necesita hacer para implementar en otro servidor se deje caer una guerra existente (y probado) de un entorno en el nuevo servidor.
Solución
Resulta que hay un parámetro Server Name
en el HTTP Listener
donde se implementa el servicio. Puede especificar este valor de la consola de administración de Glassfish y Glassfish va a utilizar este nombre en lugar del nombre de host en la URL de solicitud.
Por desgracia, este parámetro no permitirle hacer prevalecer el puerto o protocolo (http a https) si su servidor de aplicaciones y el servidor proxy no utilizan los mismos (la nuestra no lo hacen).
Lo que hice en cambio, fue escribir un simple filtro de servlet para mi servicio a manejar esto por mí.
Otros consejos
he descubierto lo que considero que es una manera muy simple para hacer frente a la cuestión: el uso mod_substitute en Apache. Desde aquellos de nosotros con este problema ya se está usando Apache, y está construido y sencilla, me ha gustado este enfoque mejor.
Me puso un bloque similar a la de abajo en una de mis archivos de configuración del Apache y encontró la alegría:
<Location />
AddOutputFilterByType SUBSTITUTE text/xml
Substitute "s|http://internal:8080/xxx|https://external/xxx|ni"
</Location>