هل يمكننا استدعاء GetServletContext () داخل الطريقة السياقية؟

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

سؤال

إنشاء servlet الذي ينفذ contextInitializer واجهة في هذا الرمز ،

ثم الوصول إلى الملف من الداخل contextinitialized() باستخدام هذا الخط

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));

حدث هذا الاستثناء

java.lang.NullPointerException         at      
    javax.servlet.GenericServlet.getServletContext(GenericServlet.java:160)

أيه أفكار ؟

هل كانت مفيدة؟

المحلول

ال ServletContextListener#contextInitialized() يمنحك ServletContextEvent الحجة التي توفر لك getServletContext() طريقة.

وبالتالي ، يجب أن يفعل هذا:

public void contextInitialized(ServletContextEvent event) {
    InputStream input = event.getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
    // ...
}

ومع ذلك ، فأنت عادة لا تريد أن تنفذ Servlet هذه الواجهة. المستمع لديه غرض مختلف. فقط تجاوز HttpServlet#init() على النحو التالي:

protected void init() throws ServletException {
    InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
    // ...
}

نصائح أخرى

لست على دراية بواجهة ContextInitializer التي تشير إليها ، ولكن بناءً على الاستثناء الذي تحصل عليه في رد فعلي الأول هو أنه لا ، لا يمكنك استدعاء GetServletContext داخل الطريقة السياقية. إذا قمت بالتحقق من http://www.docjar.com/html/api/javax/servlet/genericservlet.java.html, ، سترى أنه في السطر 160 ، يحاول الحصول على السياق من ServletConfig ، ويبدو أن كائن ServletConfig لهذا Servlet لم يتم تهيئته بعد.

سيكون أفضل رهان لك (في رأيي) هو تنفيذ الكود الذي تريد تشغيله في نقطة يتم فيه تهيئة كل من ServletConfig و ServletContext - لأنني لست على دراية بالبيئة التي تعمل معها (كما قلت ، لست على دراية بـ ContextInitializer ، لذلك لا أعرف من أين جاء ذلك) ، لا يمكنني المساعدة حقًا بقدر ما تذهب دورة حياة Servlet.

اعتمادًا على ما تحاول القيام به بالضبط ، يمكنك التفكير في وجود دفق الإدخال الخاص بك كحقل ثابت. داخل طريقة DOGET/DOPOST الخاصة بك ، يمكنك التحقق لمعرفة ما إذا كان تمت تهيئته - إذا كان ذلك رائعًا ، فستمر بشكل طبيعي ؛ وإذا لم يفعل ذلك ، فقم بتهيئته حسب الضرورة. يجب أن يكون سياقك وتكوينك متاحين في Doget/Dopost ، لذلك يجب أن تكون على ما يرام.

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