我正在使用JBoss 7.02和LifeRay Portal 6.1.0 GA1开发Java Portlet(扩展GenericPortlet)。这是可以从LifeRay的发布档案中下载的捆绑包之一。
在部署期间,当调用init()方法时,getRequestDispatcher()返回null。以下是确切的错误消息:
09:22:15,972 ERROR [org.apache.catalina.core.ContainerBase。[jboss.web]。[default-host]。[/ my-portlet-name]](MSC service thread 1-15)错误在映射期间:java.lang.NullPointerException
以下是我的init()方法的片段:
PortletConfig config = getPortletConfig();
PortletContext context = getPortletContext();
PortletRequestDispatcher normalView = context.getRequestDispatcher("/portlet.jsp");
作为一种临时解决方法,我已将所有getRequestDispatcher()
次调用移至doView()
,无需执行任何问题。我不明白为什么getRequestDispatcher()
在doView期间调用时可以找到portlet.jsp,但在init()
我是否错过了其他方法的先前调用以解决此问题?这是一个已知的问题?
感谢您的帮助。
答案 0 :(得分:0)
在doView
中获取请求调度程序是我见过它的唯一地方。我想象它在init
期间返回null,因为没有实际的分派请求。
通常,init
方法用于您不希望为每个请求产生的耗时的操作。这可能类似于从文件读取数据或创建可重用的SQL连接。
您还应该记住,您应该保持任何portlet状态线程安全。不要创建一次只能用于一个请求的类或对象变量。 portlet方法本身并不是线程安全的,因此您需要确保请求与之交互的任何变量都不会被另一个并发执行的请求操纵。
答案 1 :(得分:0)
我不熟悉Portlets,但答案应与Servlets相同。
最初部署应用程序时,init()
方法只调用一次。没有活动请求(没有人要求任何东西)或响应(没有人会读取输出的内容)。因此,getRequestDispatcher(
)返回null是非常合理的。在doView()
中,当您处理请求和响应时,请求另一个资源生成部分(或全部)响应是有意义的。
要直接解决您的问题,getRequestDispatcher(
)从portlet.jsp
找到init()
没有问题;这是缺少的请求。 (无论如何,您希望在哪里看到portlet.jsp
的结果?)
如果您确实希望在初始化期间打印某些输出,则可以尝试将其记录到文件中(如果您的应用程序已设置好)。或者,如果您知道容器控制台的位置,则可以在System.out
上显示数据。 (我经常使用第二个选项与servlet。)