Как я могу получить доступ к объекту HttpServletRequest при использовании веб-служб Java

StackOverflow https://stackoverflow.com/questions/133436

Вопрос

Я использую Java 6, Tomcat 6 и Metro.Я использую аннотации WebService и WebMethod для предоставления доступа к моему веб-сервису.Я хотел бы получить информацию об этом запросе.Я попробовал следующий код, но wsCtxt всегда имеет значение null.Какой шаг я должен предпринять, чтобы нет получите null для WebServiceContext.

Другими словами:как я могу выполнить следующую строку, чтобы получить ненулевое значение для 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();
  }
Это было полезно?

Решение

Я рекомендую вам либо переименовать вашу переменную из wsCtxt в wsContext, либо присвоить атрибут name аннотации @Resource.Тот Самый Учебное пособие по J2ee на @Resource указывает, что имя переменной используется как часть поиска.Я столкнулся с такой же проблемой, используя инъекцию ресурсов в Glassfish, вводя другой тип ресурса.

Хотя ваше правильное имя может и не быть wsContext.Я слежу за этим подсказка java.Если вам нравится имя переменной wsCtxt, то используйте атрибут name в объявлении переменной:

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

Другие советы

У меня все еще есть эта проблема.Вот мой обходной путь, заключавшийся в написании ServletRequestListener, который помещает запрос в ThreadLocal var.Затем веб-сервис может получить запрос от ThreadLocal.Другими словами, я переосмысливаю то, что у меня просто не работает.

Вот Слушатель:

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);
    }

}

Вот обертка 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();
    }

}

И web.xml проводка:

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

Веб-служба использует следующий код для получения запроса:

окончательный запрос HttpServletRequest = (HttpServletRequest) ServletRequestStore.getServletRequest();

Следующий код работает для меня с использованием Java 5, Tomcat 6 и Metro

Возможно ли, что существует конфликт между поддержкой WS в Java 6 и версией Metro, которую вы используете?Вы пробовали это в сборке 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;
}

Может быть, контекстная аннотация javax.ws.rs.core.предназначена для того, что вы ищете, а не для ресурса?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top