كيف يمكنني الحصول على HttpServletRequest الكائن عند استخدام جافا خدمات الويب

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

سؤال

أنا باستخدام جافا 6, هر 6 و المترو.يمكنني استخدام خدمة ويب و WebMethod شروح بفضح خدمة ويب.أود الحصول على معلومات حول الطلب.حاولت البرمجية التالية ، ولكن wsCtxt دائما فارغة.ما هي الخطوة التي يجب علي اتخاذها لا الحصول على باطل عن 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 أو تعيين خاصية الاسم إلى @الموارد الشرح.على J2ee البرنامج التعليمي على @الموارد يشير إلى أن اسم المتغير تستخدم كجزء من البحث.لقد واجهت نفس هذه المشكلة باستخدام الموارد الحقن في Glassfish حقن نوع مختلف من الموارد.

على الرغم من اسمك الصحيح قد لا يكون wsContext.أنا بعد هذه جافا نصيحة.إذا كنت تحب اسم المتغير wsCtxt ، ثم استخدام اسم السمة في متغير الإعلان:

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

نصائح أخرى

أنا لا تزال لديها هذه المشكلة.هنا هو بلدي العمل حول كتابة ServletRequestListener أن يضع طلب في ThreadLocal فار.ثم خدمة ويب يمكن الحصول على الطلب من ThreadLocal.وبعبارة أخرى, أنا reimplementing شيء فقط لا يعمل بالنسبة لي.

وهنا المستمع:

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

التعليمة البرمجية التالية يعمل بالنسبة لي باستخدام جافا 5, هر 6 و مترو

يمكن أن يكون من المحتمل أن هناك صراع بين WS دعم جافا 6 و إصدار مترو تستخدمه.هل جربته على جافا 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.الأساسية.سياق الشرح هو ما كنت تبحث عنه ، بدلا من الموارد ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top