在树脂服务器上使用 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。这就是我所做的仍然得到同样的异常&lt;server-default&gt; &lt;jvm-classpath&gt;E:/WorkSpace/resin-4.0.61/lib/javax.servlet.jsp-api-2.3.1.jar&lt;/jvm-classpath&gt; &lt;/server-default&gt; 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。 &lt;server-default&gt; &lt;jvm-classpath&gt;/PATH/web-inf/lib/hibernate-jpa-2.1-api-1.0.0.Final.jar&lt;/jvm-classpath&gt; &lt;jvm-classpath&gt;/PATH/web-inf/lib/hibernate-core-5.2.17.Final.jar&lt;/jvm-classpath&gt; &lt;/server-default&gt; 仍然遇到同样的异常 是不是一模一样的异常?您是否有可能在 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已正式发售!

5 -- Hibernate的基本用法 --4 深入Hibernate配置文件

分析树脂负载测试生成的 .core 文件

树脂配置在mac上找不到openssl

railo-context/admin/web.cfm 在 railo 中缺少 css 部署在树脂中