2011-02-03 73 views
12

Sé que esto puede parecer una pregunta estúpida, pero no puedo encontrar ninguna información con respecto a esta pregunta. Tengo un servicio web de Java (generado usando NetBeans) y dentro de la clase de servicio web me gustaría saber la URL en la que se implementó el servicio web. Por ejemplo, si estoy implementando el servicio web en mi servidor glassFish local, el servicio web está disponible en "http: // localhost: 8080/MyService /" donde "MyService" es el nombre de mi servicio. La razón por la que necesito saber esta URL es porque mi servicio web genera algunos archivos que necesito poner a disposición en esta URL. Por ejemplo, la llamada al servicio web devuelve una URL "http: // localhost: 8080/MyService/report.html" He encontrado algunos enlaces sobre "WebServiceContext" pero no puedo obtener la URL en la que se encuentra mi servicio web. corriendo.¿Cómo puedo encontrar la URL de mi servicio web?

Editado

Para aclarar: Clase Dentro MyWebService.java Quiero averiguar la URL en la que se desplegó mi servicio web (en este caso, mi servicio web está funcionando a "http: // localhost: 8080/MyService/", pero una vez que se implementa en un servidor de producción, esta URL cambiará)

Respuesta

4

Si se preguntan cómo encontrar el nombre de host (por ejemplo, 'localhost' o 'www.example.com') que su contenedor de servlets está escuchando usted tiene algunas opciones:

  • Añadir un punto de configuración que se fija en el tiempo de implementación (por ejemplo, el archivo de configuración, propiedad del sistema)
  • Mira en si su contenedor de servlets expone a cualquier configuración de 'máquina virtual' a través de JMX o leer sus archivos de configuración (por ejemplo tomcat hosts)
  • encontrar la dirección IP de la servidor y hacer una búsqueda de DNS para obtener su nombre de host configurado
  • Inspeccionar el encabezado 'host' de la HttpServletRequest entrante

    String hostname = request.getRequestHeader("Host");

+0

Actualmente lo tengo configurado para leer la URL de un archivo de configuración. Estoy tratando de eliminar esta configuración ya que pensé que debería ser fácil encontrar la URL del host. – Johnny

+0

Si realmente quieres una configuración cero en el lado del servidor necesitarás usar el encabezado 'Host' que está en la solicitud HTTP. –

+0

Uriah, no pude obtener esa URL del encabezado "Host". Si puedes mostrar el código, házmelo saber. Gracias. – Johnny

2

Espero poder ayudarlo, acabo de comenzar a trabajar con servicios web (Jersey REST) ​​y he encontrado que url a su punto final es: 'http: // localhost: 8080/MyService/XXX/YYY'
donde XXX = el patrón de URL en la asignación de servlet en su archivo web.xml (por ejemplo, archivo be baja)

<servlet-mapping> 
<servlet-name>Jersey REST Service</servlet-name> 
<url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

y YYY es el camino definido por @Path de su servicio web() parámetro por lo que en el caso de este ejemplo sería algo así como:

'http: // localhost: 8080/MyService/rest/myPathDefinition '

Otra cosa que se debe tener en cuenta es que de hecho puede cambiar la raíz del contexto web en eclipse, aunque por defecto será el nombre de su proyecto Java. Por favor, avíseme si necesita más aclaraciones o si esto no ayudó/alguien puede ampliarlo.

+0

No creo que me haya aclarado lo suficiente, así que intentaré reformular la pregunta. Conozco la URL de mi servicio web porque lo estoy implementando. La pregunta es, ¿cómo puedo obtener esa URL programáticamente? Por lo tanto, dentro de la clase MyWebservice.java, quiero saber la URL a la que se ha implementado mi servicio web (en este caso es "http: // localhost: 8080/MyService", pero esto cambiará una vez que el servicio web se implemente en un servidor de producción). – Johnny

8

más fácil en mi opinión, por ejemplo:

@GET 
public URI redirectSendMail(@Context UriInfo ui) { 
    return ui.getBaseUri(); 
} 

Si queremos enviar una cadena de nuevo a la cliente, indicando la ruta exacta de algún recurso, podemos desear algo como esto.

@GET 
public String getResourcePath(@Context UriInfo ui) { 
    return ui.getAbsolutePath(); 
} 
1

Agregue la siguiente propiedad en su clase de servicio web.

@Resource  
private WebServiceContext wsCtxt; 

Ahora a continuación fragmento de código le dará los valores que usted está buscando:

MessageContext msgCtxt = wsCtxt.getMessageContext(); 
    HttpServletRequest request = 
     (HttpServletRequest)msgCtxt.get(MessageContext.SERVLET_REQUEST); 

    String hostName = request .getServerName(); 
    int port = request .getServerPort(); 

Para comprobar desde donde se invoca el servicio web, utilice el código de abajo.

String clientIP = request .getRemoteAddr(); 

importaciones relacionadas son a continuación:

import javax.annotation.Resource; 

import javax.servlet.http.HttpServletRequest; 

import javax.xml.ws.WebServiceContext; 
import javax.xml.ws.handler.MessageContext; 

import weblogic.jws.Context; 

import weblogic.wsee.jws.JwsContext; 
+0

Parece que @Resource devolverá nulo en virtud de ciertas circunstancias ... Ver aquí: https://stackoverflow.com/questions/15346630/jax-ws-webservicecontext-remains-null-annotation-injection-fails – JGFMK

Cuestiones relacionadas