在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资源是否有一些技巧我错过了?
谢谢(并且真的希望得到一些答案!)。
答案 0 :(得分: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" />
不确定第一个approch,但是如果没有找到JNDI资源,第二个肯定会提前失败。 希望这会有所帮助。