Java Web サービスを使用するときに HttpServletRequest オブジェクトにアクセスするにはどうすればよいですか
-
02-07-2019 - |
質問
Java 6、Tomcat 6、および Metro を使用しています。WebService と WebMethod アノテーションを使用して Web サービスを公開します。リクエストに関する情報を入手したいのですが。次のコードを試してみましたが、wsCtxt は常に null です。どのような手順を踏む必要がありますか ない WebServiceContext の場合は null を取得します。
言い換えると:次の行を実行して wsCtxt の null 以外の値を取得するにはどうすればよいですか?
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 アノテーションに割り当てることをお勧めします。の @Resource に関する J2ee チュートリアル 変数の名前が検索の一部として使用されることを示します。Glassfish でリソース インジェクションを使用して別の種類のリソースを注入すると、これと同じ問題が発生しました。
ただし、正しい名前は wsContext ではない可能性があります。私はこれに従っています Javaのヒント. 。変数名 wsCtxt が気に入った場合は、変数宣言で name 属性を使用します。
@Resource(name="wsContext") WebServiceContext wsCtxt;
他のヒント
この問題はまだ残っています。私の回避策は、リクエストを ThreadLocal 変数に入れる ServletRequestListener を書くことでした。その後、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>
Web サービスは次のコードを使用してリクエストを取得します。
final httpservletrequest request =(httpservletrequest)servletrequestStore.getServletRequest();
次のコードは、Java 5、Tomcat 6、Metro を使用している場合に機能します。
Java 6 の WS サポートと使用している 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.Context アノテーションが探しているものですか?