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();
  }
Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top