0

Liferay 论坛上没有关于这个问题的快乐,这个项目的时钟正在滴答作响。这可能是由于我对Spring的了解不足造成的。

我在 server.xml 中定义了一个 JNDI 全局资源,在我的 Tomcat 7 /conf 文件夹中的 context.xml 中有一个资源链接。我知道正在加载 JNDI 资源,因为我看到验证查询在服务器启动时正在运行。到目前为止,一切都很好。

我有一个只为其他 portlet 提供服务的 portlet。在那个 portlet 中,我有一个 hibernate.cfg.xml,它有一个会话工厂,它也指向 JDBC 资源(不知道这是否需要)。我在服务 portlet 中还有一个 ext-spring.xml 文件,它具有以下内容:

<bean id="liferayHibernateSessionFactory" class="com.liferay.portal.spring.hibernate.PortletHibernateConfiguration" >
<property name="dataSource" ref="MyJDBCResource" />
</bean>

<bean id="MyJDBCResource" class="org.springframework.jndi.JndiObjectFactoryBean" >
<property name="jndiName" value="java:comp/env/jdbc/MyJDBCResource" />
</bean>

在 ext-spring.xml 中添加上述内容修复了部署时该服务 portlet 上出现 bean 错误的问题。在该服务构建器构建的 portlet 中,创建了一个服务 jar,我将该服务 jar 放在 Tomcat_Home/lib/ext 文件夹中,以便我可以在我的 portlet 中使用该 portlet 提供的服务。到目前为止,一切都很好。但是,当我使用 JNDI 引用调用另一个 portlet 提供的服务的 portlet 方法时,我收到“用户缺少特权或找不到对象”错误。肯定是找不到对象。运行查询时,我看到 JNDI 资源条目指定的 JDBC 连接上绝对没有活动,并且在深入研究连接属性时,我只看到正在使用的 HSQLDB 驱动程序。它应该据我了解,正在使用我的全局资源 JNDI 条目中指定的 MSSQL 驱动程序。

那么我做错了什么?我是否需要在调用服务的 portlet 中添加一些配置条目?

这看起来很简单。在阅读许多提供有关使用 JNDI/JDBC 资源的说明的帖子时,我似乎正确地遵循了它们。我错过了在 LR 6.1.1 和 Tomcat 7 中使用 JNDI/JDBC 资源的技巧吗?

谢谢(真的希望得到一些答案!)。

4

1 回答 1

1

首先,您可以尝试像这样重写 JNDI 资源引用:

<bean id="MyJDBCResource" class="org.springframework.jndi.JndiObjectFactoryBean" >
  <property name="jndiName" value="jdbc/MyJDBCResource" />
</bean>

此外,您可以在 Spring 中尝试不同的 JNDI 资源查找方法:

<jee:jndi-lookup id="MyJDBCResource" jndi-name="jdbc/MyJDBCResource" expected-type="javax.sql.DataSource" />

不确定第一个方法,但如果找不到 JNDI 资源,第二个肯定会提前失败。希望这可以帮助。

于 2013-01-16T12:46:52.473 回答