Como posso obter acesso ao objeto HttpServletRequest ao usar Java Web Services
-
02-07-2019 - |
Pergunta
Eu estou usando Java 6, Tomcat 6 e Metro. Eu uso WebService e WebMethod anotações para expor meu serviço web. Gostaria de obter informações sobre a solicitação. Eu tentei o seguinte código, mas wsCtxt é sempre nulo. O passo que devo dar a não get nulo para o WebServiceContext.
Em outras palavras: como posso executar o seguinte linha para obter um valor não 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();
}
Solução
Eu recomendo que você quer mudar o nome da variável de wsCtxt para wsContext ou atribuir o atributo nome para a anotação @Resource. A J2ee tutorial sobre @Resource indica que o nome do a variável é utilizada como parte da pesquisa. Eu encontrei esse mesmo problema usando a injeção de recursos no Glassfish injetar um tipo diferente de recurso.
Embora o seu nome correto pode não ser wsContext. Estou seguindo este tip java . Se você gosta do nome da variável wsCtxt, em seguida, usar o atributo nome na declaração da variável:
@Resource(name="wsContext") WebServiceContext wsCtxt;
Outras dicas
Ainda tenho este problema. Aqui está a minha solução alternativa era escrever um ServletRequestListener que coloca o pedido em uma var ThreadLocal. Então o WebService pode obter a pedido do ThreadLocal. Em outras palavras, eu estou reimplementar algo que simplesmente não funciona para mim.
Aqui está o Listener:
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);
}
}
Aqui está a capa 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();
}
}
E a fiação web.xml:
<listener>
<listener-class>ecb.sdw.webservices.SDMXRequestListener</listener-class>
</listener>
O serviço Web usa o código a seguir para obter o pedido:
HttpServletRequest último pedido = (HttpServletRequest) ServletRequestStore.getServletRequest ();
O código a seguir funciona para mim usando Java 5, Tomcat 6 e Metro
Seria possível que haja um conflito entre o apoio WS em Java 6 e a versão do Metro você está usando. você já tentou isso em um Java 5 construção?
@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;
}
Talvez a anotação javax.ws.rs.core.Context é para o que você está procurando, em vez de recursos?