Как получить доступ к объекту HttpServletRequest при использовании Java Web Services
Я использую 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();
}
Ответы
Ответ 1
Я рекомендую вам либо переименовать переменную из wsCtxt в wsContext, либо назначить атрибут name для аннотации @Resource. Учебное пособие J2ee на @Resource указывает, что имя переменной используется как часть поиска. Я столкнулся с этой же проблемой, используя инъекцию ресурсов в Glassfish, впрыскивающую другой тип ресурса.
Хотя ваше правильное имя не может быть wsContext. Я следую этому java tip. Если вам нравится имя переменной wsCtxt, используйте атрибут name в объявлении переменной:
@Resource(name="wsContext") WebServiceContext wsCtxt;
Ответ 2
У меня все еще есть эта проблема. Вот моя работа - написать ServletRequestListener, который помещает запрос в varList ThreadLocal. Затем WebService может получить запрос от 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();
Ответ 3
Следующий код работает для меня с использованием 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;
}
Ответ 4
Возможно, аннотация javax.ws.rs.core.Context предназначена для того, что вы ищете вместо ресурса?