paso - web service java netbeans
¿Cómo puedo acceder al objeto HttpServletRequest cuando uso Java Web Services? (4)
¿Tal vez la anotación javax.ws.rs.core.Context es para lo que estás buscando, en lugar de Resource?
Estoy usando Java 6, Tomcat 6 y Metro. Uso las anotaciones WebService y WebMethod para exponer mi servicio web. Me gustaría obtener información sobre la solicitud. Probé el siguiente código, pero wsCtxt siempre es nulo. ¿Qué paso debo dar para no obtener un valor 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();
}
Le recomiendo que cambie el nombre de su variable de wsCtxt a wsContext o asigne el atributo de nombre a la anotación @Resource. El tutorial de J2ee en @Resource indica que el nombre de la variable se usa como parte de la búsqueda. He encontrado este mismo problema usando la inyección de recursos en Glassfish inyectando un tipo diferente de recurso.
Aunque su nombre correcto puede no ser wsContext. Estoy siguiendo este consejo de Java . Si le gusta el nombre de la variable wsCtxt, utilice el atributo de nombre en la declaración de la variable:
@Resource(name="wsContext") WebServiceContext wsCtxt;
El siguiente código funciona para mí usando Java 5, Tomcat 6 y Metro
Es posible que exista un conflicto entre la compatibilidad con WS en Java 6 y la versión de Metro que está utilizando. ¿Lo has probado en una versió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;
}
Todavía tengo este problema. Aquí está mi trabajo fue escribir un ServletRequestListener que coloca la solicitud en una var. ThreadLocal. Entonces el servicio web puede obtener la solicitud de ThreadLocal. En otras palabras, estoy volviendo a implementar 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 contenedor 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 usa el siguiente código para obtener la solicitud:
solicitud final HttpServletRequest = (HttpServletRequest) ServletRequestStore.getServletRequest ();