1

我将 Spring 3.1 和 Eclipselink 2 与 Tomcat 一起使用,但由于某种原因,数据没有持久化。虽然正在生成表。

调度程序-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:p="http://www.springframework.org/schema/p"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
   http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:component-scan base-package="com.myapp.user.controllers" />
<mvc:annotation-driven />

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:prefix="/WEB-INF/jsp/"
      p:suffix=".jsp" />

</beans>

应用程序上下文.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:p="http://www.springframework.org/schema/p"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<aop:aspectj-autoproxy />

<context:load-time-weaver aspectj-weaving="on"/>


<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

<bean id="loadTimeWeaver" class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    
<bean id="jpaVendorAdapter"
      class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
    <property name="database" value="MYSQL"/>
    <property name="showSql" value="true"/>
    <property name="generateDdl" value="false"/>
    <property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform"/>
</bean>

<bean id="entityManagerFactory"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
      p:persistenceUnitName="myAppPU"
      p:persistenceXmlLocation="classpath*:META-INF/persistence.xml"
      p:jpaVendorAdapter-ref="jpaVendorAdapter"
      p:loadTimeWeaver-ref="loadTimeWeaver"
      p:dataSource-ref="dataSource"
/>

<bean id="txManager"
      class="org.springframework.orm.jpa.JpaTransactionManager"
      p:entityManagerFactory-ref="entityManagerFactory"
      p:dataSource-ref="dataSource"
/>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/qpdb?zeroDateTimeBehavior=convertToNull"/>
    <property name="username" value="root"/>
    <property name="password" value=""/>
</bean>

<tx:annotation-driven transaction-manager="txManager" />

</beans>

持久性.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="myAppPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.myapp.entities.GenericUser</class>
<properties>
  <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/qpdb?zeroDateTimeBehavior=convertToNull"/>
  <property name="javax.persistence.jdbc.password" value=""/>
  <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
  <property name="javax.persistence.jdbc.user" value="root"/>
  <!--<property name="eclipselink.weaving" value="static"/>-->
</properties>
</persistence-unit>
</persistence>

WelcomeController.java

package com.myapp.user.controllers;
import com.myapp.entities.GenericUser;
import java.math.BigInteger;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;

@Transactional(propagation=Propagation.SUPPORTS)
@Controller
public class WelcomeController {

@PersistenceContext
private EntityManager entityManager;

public WelcomeController() {
}

@RequestMapping({"/"})
public String showPublicPage(Map<String, Object> model) {
    GenericUser gu = new GenericUser();
    addUser(gu);
    return "welcome";
}

@Transactional(propagation= Propagation.REQUIRED,readOnly=false)
public void addUser(GenericUser gu) {
    gu.setUserID(BigInteger.ONE);
    gu.setEmail("asdfadf");
    entityManager.persist(gu);
}
}

通用用户.java

package com.myapp.entities;

import java.io.Serializable;
import java.math.BigInteger;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;

@Entity
@Table(name="generic_user")
public class GenericUser implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "USER_ID")
private BigInteger userID;
@Column(name = "USERNAME")
private String username;
@Column(name = "EMAIL")
private String email;
@Column(name = "PASSWORD")
private String password;

public BigInteger getUserID() {
    return userID;
}

public void setUserID(BigInteger id) {
    this.userID = id;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (userID != null ? userID.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof GenericUser)) {
        return false;
    }
    GenericUser other = (GenericUser) object;
    if ((this.userID == null && other.userID != null) || (this.userID != null && !this.userID.equals(other.userID))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "com.myapp.entities.GenericUser[ id=" + userID + " ]";
}
}

我正在使用 -javaagent:path/to/spring-agent-2.5.6.SEC03.jar 启动 tomcat

Tomcat 日志

2013 年 7 月 11 日晚上 9:30:36 org.apache.catalina.core.ApplicationContext 日志

信息:销毁 Spring FrameworkServlet 'dispatcher'

2013 年 7 月 11 日晚上 9:30:36 org.apache.catalina.core.ApplicationContext 日志

信息:关闭 Spring 根 WebApplicationContext

2013 年 7 月 11 日晚上 9:33:13 org.apache.catalina.core.ApplicationContext 日志

信息:在类路径上未检测到 Spring WebApplicationInitializer 类型

2013 年 7 月 11 日晚上 9:33:13 org.apache.catalina.core.ApplicationContext 日志

信息:初始化 Spring 根 WebApplicationContext

2013 年 7 月 11 日晚上 9:33:13 org.apache.catalina.core.StandardContext listenerStart

严重:向 org.springframework.web.context.ContextLoaderListener 类的侦听器实例发送上下文初始化事件的异常

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:来自 ServletContext 资源 [/WEB-INF/applicationContext.xml] 的 XML 文档中的第 52 行无效;嵌套异常是 org.xml.sax.SAXParseException;行号:52;列号:6;不允许匹配“[xX][mM][lL]”的处理指令目标。

在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)

在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)

在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)

在 org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)

在 org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)

在 org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)

在 org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)

在 org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)

在 org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:131)

在 org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:522)

在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:436)

在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)

在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)

在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)

在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)

在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)

在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)

在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)

在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)

在 org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:649)

在 org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1585)

在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)

在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)

在 java.util.concurrent.FutureTask.run(FutureTask.java:166)

在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)

在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)

在 java.lang.Thread.run(Thread.java:722)

引起:org.xml.sax.SAXParseException;行号:52;列号:6;不允许匹配“[xX][mM][lL]”的处理指令目标。

在 com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)

在 com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)

在 com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)

在 com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)

在 com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1388)

在 com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPIData(XMLScanner.java:675)

在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanPIData(XMLDocumentFragmentScannerImpl.java:980)

在 com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPI(XMLScanner.java:643)

在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:913)

在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)

在 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)

在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)

在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)

在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)

在 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)

在 com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:237)

在 com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:300)

在 org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)

在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)

... 27 更多

2013 年 7 月 11 日晚上 9:33:13 org.apache.catalina.core.ApplicationContext 日志

信息:关闭 Spring 根 WebApplicationContext

2013 年 7 月 11 日晚上 9:33:13 org.apache.catalina.core.StandardContext listenerStop

严重:向 org.springframework.web.context.ContextLoaderListener 类的侦听器实例发送上下文破坏事件的异常

java.lang.IllegalStateException:BeanFactory 未初始化或已关闭 - 在通过 ApplicationContext 访问 bean 之前调用“刷新”

在 org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:172)

在 org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1066)

在 org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1040)

在 org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:988)

在 org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:556)

在 org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:142)

在 org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4819)

在 org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5466)

在 org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)

在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)

在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)

在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)

在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)

在 org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:649)

在 org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1585)

在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)

在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)

在 java.util.concurrent.FutureTask.run(FutureTask.java:166)

在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)

在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)

在 java.lang.Thread.run(Thread.java:722)

2013 年 7 月 11 日晚上 9:33:15 org.apache.catalina.core.ApplicationContext 日志

信息:在类路径上未检测到 Spring WebApplicationInitializer 类型

2013 年 7 月 11 日晚上 9:33:15 org.apache.catalina.core.ApplicationContext 日志

信息:初始化 Spring 根 WebApplicationContext

2013 年 7 月 11 日晚上 9:33:18 org.apache.catalina.core.ApplicationContext 日志

信息:初始化 Spring FrameworkServlet 'dispatcher'

2013 年 7 月 11 日晚上 9:34:32 org.apache.catalina.core.ApplicationContext 日志

信息:销毁 Spring FrameworkServlet 'dispatcher'

2013 年 7 月 11 日晚上 9:34:32 org.apache.catalina.core.ApplicationContext 日志

信息:关闭 Spring 根 WebApplicationContext

2013 年 7 月 11 日晚上 9:34:34 org.apache.catalina.core.ApplicationContext 日志

信息:在类路径上未检测到 Spring WebApplicationInitializer 类型

2013 年 7 月 11 日晚上 9:34:34 org.apache.catalina.core.ApplicationContext 日志

信息:初始化 Spring 根 WebApplicationContext

2013 年 7 月 11 日晚上 9:34:37 org.apache.catalina.core.ApplicationContext 日志

信息:初始化 Spring FrameworkServlet 'dispatcher'

应用程序成功运行并打开“欢迎”视图,但数据(GenericUser gu)不存在......

4

3 回答 3

1

可能p:persistenceXmlLocation="classpath*:META-INF/persistence.xml"这是错误的..尝试将 xml 放在您的 WEB-INF/ 文件夹中并将其链接为: persistenceXmlLocation="myxml.xml"

于 2013-07-11T20:17:57.000 回答
1

您能否检查依赖项 jar 是否在正确的位置可用?

于 2013-07-31T19:06:42.283 回答
0

终于解决了...发布我的解决方案以供将来参考..

在找到可行的解决方案之前,我改变了很多东西。我不记得问题出在哪里了。所以我提到了我所做的所有更改。

  1. 将所有 xsd 版本更改为 3.1 ..(可能无关紧要)

  2. 如果您使用 tomcatspring-tomcat-weaver.jar进行加载时间编织,如此所述。

  3. 主要问题:

Spring 文档声明如下:

<tx:annotation-driven/>仅在定义它的同一应用程序上下文中的 bean 上查找 @Transactional。这意味着,如果您为 DispatcherServlet 放入 WebApplicationContext,它只会检查控制器中的 @Transactional bean,而不是您的服务。有关详细信息,请参阅第 15.2 节,“DispatcherServlet”。

由于<tx:annotation-driven>applicationContext.xml所有要使用的类中声明@Transactional必须在应用程序上下文中发现。因此,您还需要<context:component-scan>在应用程序上下文中指定。但请确保您不会重新发现dispatcher-servlet.xml. 您可以使用元素内的include-filter元素来实现此目的。详细解释在这里exclude-filter<context:component-scan>

您将无法@Transactional在您的控制器中使用..(您不应该在 IMO 中使用)

于 2013-08-04T17:53:42.743 回答