Pregunta

Estoy usando Java 6, Tomcat 6 y Metro. Uso anotaciones de WebService y WebMethod para exponer mi servicio web. Me gustaría obtener información sobre la solicitud. Intenté el siguiente código, pero wsCtxt siempre es nulo. ¿Qué paso debo dar para que no quede nulo para el WebServiceContext.

En otras palabras: ¿cómo puedo ejecutar la siguiente línea para obtener un valor no nulo para wsCtxt?

MessageContext msgCtxt = wsCtxt.getMessageContext ();

@WebService
public class MyService{

  @Resource
  WebServiceContext wsCtxt;

  @WebMethod
  public void myWebMethod(){
    MessageContext msgCtxt = wsCtxt.getMessageContext();
    HttpServletRequest req = (HttpServletRequest)msgCtxt.get(MessageContext.SERVLET_REQUEST);
    String clientIP = req.getRemoteAddr();
  }
¿Fue útil?

Solución

Te recomiendo que cambies el nombre de tu variable de wsCtxt a wsContext o asignes el atributo name a la anotación @Resource. El tutorial J2ee en @Resource indica que el nombre de La variable se utiliza como parte de la búsqueda. Me he encontrado con este mismo problema al usar la inyección de recursos en Glassfish inyectando un tipo diferente de recurso.

Aunque su nombre correcto puede no ser wsContext. Estoy siguiendo esto java tip . Si le gusta el nombre de la variable wsCtxt, use el atributo de nombre en la declaración de la variable:

  

@Resource (name = " wsContext ") WebServiceContext wsCtxt;

Otros consejos

Todavía tengo este problema. Aquí está mi solución alternativa para escribir un ServletRequestListener que coloca la solicitud en una var de ThreadLocal. Luego, el servicio web puede obtener la solicitud de ThreadLocal. En otras palabras, estoy reimplementando algo que simplemente no funciona para mí.

Aquí está el oyente:

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

public class SDMXRequestListener implements ServletRequestListener {

    public SDMXRequestListener() {
    }

    public void requestDestroyed(ServletRequestEvent event) {
    }

    public void requestInitialized(ServletRequestEvent event) {
        final ServletRequest request = event.getServletRequest();
        ServletRequestStore.setServletRequest(request);
    }

}

Aquí está el envoltorio de ThreadLocal:

import javax.servlet.ServletRequest;

public class ServletRequestStore {

    private final static ThreadLocal<ServletRequest> servletRequests = new ThreadLocal<ServletRequest>();

    public static void setServletRequest(ServletRequest request) {
        servletRequests.set(request);
    }

    public static ServletRequest getServletRequest() {
        return servletRequests.get();
    }

}

Y el cableado web.xml:

  <listener>
        <listener-class>ecb.sdw.webservices.SDMXRequestListener</listener-class>
    </listener>

El servicio web utiliza el siguiente código para obtener la solicitud:

  

solicitud final HttpServletRequest =   (HttpServletRequest)   ServletRequestStore.getServletRequest ();

El siguiente código funciona para mí usando Java 5, Tomcat 6 y Metro

Es posible que exista un conflicto entre el soporte de WS en Java 6 y la versión de Metro que está utilizando. ¿Lo has probado en una compilación Java 5?

@WebService
public class Sample {
    @WebMethod
    public void sample() {
        HttpSession session = findSession();
        //Stuff

    }
    private HttpSession findSession() {
        MessageContext mc = wsContext.getMessageContext();
        HttpServletRequest request = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
        return request.getSession();
    }
    @Resource
    private WebServiceContext wsContext;
}

¿Quizás la anotación javax.ws.rs.core.Context es para lo que está buscando, en lugar de Resource?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top