هل يمكننا استدعاء GetServletContext () داخل الطريقة السياقية؟
-
22-09-2019 - |
سؤال
إنشاء 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 ، لذلك يجب أن تكون على ما يرام.