Как я могу получить доступ к объекту HttpServletRequest при использовании веб-служб Java
-
02-07-2019 - |
Вопрос
Я использую 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.предназначена для того, что вы ищете, а не для ресурса?