0

我正在使用 JBoss 7.02 和 LifeRay Portal 6.1.0 GA1 开发 Java Portlet(扩展 GenericPortlet)。这是可以从 LifeRay 的发布档案中下载的捆绑包之一。

在部署过程中,调用 init() 方法时,getRequestDispatcher() 返回 null。以下是确切的错误消息:

09:22:15,972 错误 [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/my-portlet-name]](MSC 服务线程 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()

我是否错过了可以解决此问题的其他方法的先前调用?这是一个已知的问题?

谢谢你的帮助。

4

2 回答 2

0

我不熟悉 Portlet,但答案应该与 Servlet 相同。

当您的应用程序最初部署时,该init()方法只被调用一次。没有主动请求(没有人要求任何东西)或响应(没有人会读取输出是什么)。因此getRequestDispatcher() 返回 null 是非常合理的。在doView()中,当您处理请求和响应时,要求另一个资源生成部分(或全部)响应是有意义的。

为了直接解决您的问题, )从;getRequestDispatcher(定位没有问题 这是缺少的请求。(无论如何,您希望在哪里看到 的结果?)portlet.jspinit()portlet.jsp

如果您确实想在初始化期间打印一些输出,则可以尝试将其记录到文件中,如果您的应用程序已为此设置。System.out或者,如果您知道容器的控制台在哪里,您可以在 上显示数据。(我经常在 servlet 中使用第二个选项。)

于 2013-08-08T16:46:49.507 回答
0

获得请求调度doView程序是我见过的唯一完成的地方。我会想象它在期间返回 null ,init因为没有实际的调度请求。

通常,该init方法用于您不想为每个请求招致的耗时操作。这可能类似于从文件中读取数据,或创建可重用的 SQL 连接。

您还应该记住,您应该保持任何 portlet 状态线程的安全。不要创建一次只能用于一个请求的类或对象变量。portlet 方法本身不是线程安全的,因此您需要确保请求与之交互的任何变量都不会被同时执行的另一个请求操纵。

于 2013-07-10T18:06:37.373 回答