在树脂服务器上使用 Hibernate 5.4.1 的 Spring 5.0.7
Posted
技术标签:
【中文标题】在树脂服务器上使用 Hibernate 5.4.1 的 Spring 5.0.7【英文标题】:Spring 5.0.7 With Hibernate 5.4.1 on resin server 【发布时间】:2019-08-08 16:10:19 【问题描述】:这个例子在具有相同 jar 的 Tomcat9 中运行良好,但在 Resin 4.0.61 Web 服务器中无法运行 在resin.xml 文件中配置Spring MVC -
<servlet>
<servlet-name>springportfolio</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springportfolio-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup></servlet>
<servlet-mapping>
<servlet-name>springportfolio</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
springportfolio-servlet.xml配置文件-
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- Add support for conversion, formatting and validation support -->
<mvc:annotation-driven />
<!-- Add support for component scanning -->
<context:component-scan
base-package="com.example.portfolio" />
<!-- Define Spring MVC view resolver -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix"
value="/web-inf/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- Step 1: Define Database DataSource / connection pool -->
<bean id="myDataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass"
value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUrl"
value="xxxxxx" />
<property name="user" value="xxxx" />
<property name="password" value="xxx" />
<!-- these are connection pool properties for C3P0 -->
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="20" />
<property name="maxIdleTime" value="30000" />
</bean>
<!-- Step 2: Setup Hibernate session factory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="packagesToScan"
value="com.example.portfolio.entity" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- Step 3: Setup Hibernate transaction manager -->
<bean id="myTransactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- Step 4: Enable configuration of transactional behavior based on annotations -->
<tx:annotation-driven
transaction-manager="myTransactionManager" />
获取异常 - 错误 |上下文初始化失败
org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“customerController”的 bean 时出错:不满意 通过字段“userService”表示的依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“userServiceImp”的 bean 时出错:不满足的依赖关系 通过字段“userDao”表示;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“customerDAOImpl”的 bean 时出错:不满意 通过字段“sessionFactory”表达的依赖关系;嵌套异常 是 org.springframework.beans.factory.BeanCreationException: 错误 创建 ServletContext 中定义的名称为“sessionFactory”的 bean 资源 [/WEB-INF/springportfolio-servlet.xml]:init 的调用 方法失败;嵌套异常是 java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
【问题讨论】:
Resin 4.0.61 服务器中的某处必须有一个较旧的 JPA jar。较旧的 JPA 规范在导致此问题的 Table 注释上没有 index() 方法。寻找一个名为 jpa-.jar 的 jar 您使用的是哪个 Spring 版本,尤其是 Hibernate 版本?问题是 Resin 4.0.61 是 JEE 6.0 服务器。这意味着,它自带 JPA 2.0。您的 Spring 应用程序似乎需要/期望 JPA 2.1,即包含 JPA 2.1 API 的应用程序。也许可以将您的 spring/hibernate 版本降级到 JPA 2.0 或将 Resin 升级到 JPA 2.1 - 另请参阅groups.google.com/forum/#!msg/caucho-resin/divdHN_y2o4/… 【参考方案1】:Resin 4.0.61 符合 JEE 6.0 规范。 JEE 6.0 在 2.0 版中包含 JPA。根据错误消息,应用程序需要 2.1 版的 JPA。将应用程序降级到 JPA 2.0 或将服务器升级到 JPA 2.1,如 forum
中所述【讨论】:
我将开发降级到休眠 5.2.17 支持 2.1 版中的 JPA 现在如何将服务器升级到 JPA 2.1。这就是我所做的仍然得到同样的异常<server-default> <jvm-classpath>E:/WorkSpace/resin-4.0.61/lib/javax.servlet.jsp-api-2.3.1.jar</jvm-classpath> </server-default>
javax.servlet.jsp-api-2.3.1.jar 是错误的 jar。正确的 jar 需要包含错误消息中的注解,即 javax.persistence.Table,并且注解需要具有 index() 方法。请注意,不仅需要添加 JPA API jar,还需要添加实现 jar。
现在我正在使用 JPA 规范的 hibernate-core 实现和用于开发 Hibernate JPA 实现的 hibernate-jpa-2.1-api-1.0.0.Final.jar。 <server-default> <jvm-classpath>/PATH/web-inf/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar</jvm-classpath> <jvm-classpath>/PATH/web-inf/lib/hibernate-core-5.2.17.Final.jar</jvm-classpath> </server-default>
仍然遇到同样的异常
是不是一模一样的异常?您是否有可能在 Resin 中进行调试并查看它从何处获取 javax.persistence.Table 类?我的意思是,来自哪个罐子?
好吧,我不是配置 Resin 服务器的专家。一般来说,Resin 与应用程序不兼容,这是肯定的。如果 Resin 无法升级(JPA 方式)并且应用程序无法降级到 JPA 2.0,那么我的结论是应用程序无法在该服务器中运行。以上是关于在树脂服务器上使用 Hibernate 5.4.1 的 Spring 5.0.7的主要内容,如果未能解决你的问题,请参考以下文章
OpenJDK 64 位服务器 VM 警告:已禁用存档的非系统类(树脂、Ubuntu、OpenJDK 11)
eSUN新品——高透抗黄变类亚克力树脂eResin-PMMA Like已正式发售!