2008-09-25 1 views
13

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

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

ответ

10

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

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

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

1

Может аннотацию javax.ws.rs.core.Context это за то, что вы ищете, а не ресурс?

3

Я до сих пор есть эта проблема. Вот моя работа - написать 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> 

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

final HttpServletRequest request = (HttpServletRequest) ServletRequestStore.getServletRequest();

3

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

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