2013-07-11 10 views
1

J'utilise Spring 3.1 et Eclipselink 2 avec Tomcat, mais pour une raison quelconque, les données ne sont pas persistantes. La table est en cours de génération.Problème de persistance Spring Eclipselink (aucune insertion)

dispatcher-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> 

applicationContext.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> 

persistence.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); 
} 
} 

GenericUser.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 + " ]"; 
} 
} 

Je commence avec tomcat -javaagent: chemin/vers/printemps-agent 2.5.6.SEC03.jar

Tomcat Log

11 juillet 2013 21:30:36 org.apache.catalina.core.ApplicationContext log

INFO: Détruire 'dispatcher' Spring FrameworkServlet

11 juillet 2013 21:30:36 org.apache.catalina.core.ApplicationContext log

INFO: Fermeture de la racine de printemps WebApplicationContext

11 juillet 2013 21:33:13 org.apache. catalina.core.ApplicationContext log

INFO: Pas de printemps types WebApplicationInitializer détectés sur classpath

11 juillet 2013 21:33:13 org.apache.catalina.core.ApplicationContext log

IN FO: Initialiser racine printemps WebApplicationContext

11 juillet 2013 21:33:13 org.apache.catalina.core.StandardContext listenerStart

GRAVES: Exception envoi événement initialisé contexte à l'auditeur instance de org.springframework de classe. web.context.ContextLoaderListener

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: La ligne 52 du document XML de la ressource ServletContext [/WEB-INF/applicationContext.xml] n'est pas valide; l'exception imbriquée est org.xml.sax.SAXParseException; lineNumber: 52; columnNumber: 6; La cible de l'instruction de traitement correspondant "[xX] [mM] [lL]" n'est pas autorisée.

à 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 (XmlWebApplicati onContext.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)

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

Causée par: org.xml.sax.SAXParseException; lineNumber: 52; columnNumber: 6; La cible de l'instruction de traitement correspondant "[xX] [mM] [lL]" n'est pas autorisée.

à 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)

à l'adresse com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ PrologDriver.next (XMLDocumentS cannerImpl.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 (De faultDocumentLoader.java: 75)

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

... 27 plus

11 juillet 2013 09:33: 13 h org.apache.catalina.core.ApplicationContext log

INFO: Fermeture de la racine printemps WebApplicationContext

11 juillet 2013 21:33:13 org.apache.catalina.core.StandardContext listenerStop

GRAVES: événement détruit Exception contexte envoyer à l'auditeur instance de la classe org.springframework.web.context.ContextLoaderListener

java.lang.IllegalStateException: BeanFactory non initialisé ou déjà fermé - appeler « rafraîchir » avant d'accéder à des haricots via ApplicationContext

à 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)

11 juillet 2013 21:33:15 org.apache.catalina.core.ApplicationContext log

INFO: Pas de printemps types WebApplicationInitializer détectés sur classpath

11 juil 2013 21:33:15 org.apache.catalina.core.ApplicationContext log

INFO: racine Initialiser printemps WebApplicationContext

11 juillet 2013 21:33:18 org.apache.catalina.core.ApplicationContext log

INFO: 'dispatcher' Spring FrameworkServlet Initializing

11 juillet 2013 21:34:32 org.apache.catalina.core.ApplicationContext log

INFO: Spring FrameworkServlet Destruction 'dispatcher'

11 juillet 2013 21:34:32 org.apache.catalina.core.ApplicationContext log

INFO: Fermeture de la racine de printemps WebApplicationContext

11 juillet 2013 21:34:34 org.apache.catalina. core.Application Contexte journal

INFO: Pas de printemps types WebApplicationInitializer détectés sur classpath

11 juillet 2013 21:34:34 org.apache.catalina.core.ApplicationContext log

INFO: Initialiser racine printemps WebApplicationContext

11 juillet 2013 21:34:37 ​​org.apache.catalina.core.ApplicationContext log

INFO: 'dispatcher' Spring FrameworkServlet Initializing

L'application fonctionne avec succès et ouvre la vue 'welcome', mais les données (GenericUser gu) ne persiste pas ...

+0

Vos applicationContext.xml ont un problema en ligne 52. Probablement la ligne: ' 'Vous devez résoudre ce problème en premier ... – renanlf

+0

corrigé .. Mais maintenant, aucune unité de persistance avec le nom myAppPU ne peut être trouvée ... persistence.xml va dans build/web/WEB-INF/classes/META-INF/after build .. et j'ai spécifié persistenceXmlLocation dans applicationContext.xml ... Des idées? – PrawDG

Répondre

0

Enfin résolu ... Poster ma solution pour référence future ..

J'ai changé beaucoup de choses avant d'arriver à une solution de travail .. je ne me souviens pas exactement où était le problème .. donc je mentionne tous les changements que j'ai faits.

  1. Changé toutes les versions xsd à 3.1 .. (il ne peut pas avoir compté)

  2. Si vous utilisez tomcat utiliser spring-tomcat-weaver.jar pour le tissage de temps de chargement comme mentionné here.

  3. La question principale:

La documentation de printemps énonce ce qui suit:.

<tx:annotation-driven/> ne cherche que @Transactional sur les haricots dans le même contexte de l'application, il est défini dans Cela signifie que Si vous insérez un WebApplicationContext pour un DispatcherServlet, il vérifie uniquement les beans @Transactional dans vos contrôleurs et non vos services. Voir Section 15.2, «DispatcherServlet» pour plus d'informations.

Depuis <tx:annotation-driven> est déclarée dans applicationContext.xml toutes les classes qui veulent utiliser @Transactional doit être découvert dans le contexte de l'application. Vous devez donc également spécifier <context:component-scan> dans le contexte de l'application. Mais assurez-vous de ne pas redécouvrir les contrôleurs déjà spécifiés dans dispatcher-servlet.xml. Vous pouvez utiliser les éléments include-filter et exclude-filter dans l'élément <context:component-scan> pour y parvenir. Explication détaillée here.

Vous ne pourrez pas utiliser @Transactional dans vos contrôleurs .. (vous ne devriez pas l'OMI)

1

Probablement p:persistenceXmlLocation="classpath*:META-INF/persistence.xml" cela est faux .. Essayez de mettre le xml sur votre WEB-INF/dossier et liez-le uniquement comme: persistenceXmlLocation = "myxml.xml"

+0

mais la plus grande partie de la documentation de printemps spécifie qu'elle est dans meta-inf/et notez qu'elle ne dit pas persistence.xml non trouvée (elle donne une exception FileNotFoundException si je donne le mauvais chemin), elle indique simplement l'unité de persistance non trouvée. .. – PrawDG

1

Pouvez-vous vérifier si les fichiers dépendants sont disponibles à l'emplacement correct?

+0

résolu le problème .. toutes les dépendances étaient dans le bon endroit .. – PrawDG

Questions connexes