IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Gérer le lazy loading [Data]


Sujet :

Spring Java

  1. #1
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut Gérer le lazy loading
    Bonjour à tous,

    Je développe une application avec les technos suivantes : Wicket 1.4.17 - Spring 3.0.4 - JPA 2.0 - Hibernate 3.5.6.

    J'ai pas eu de problème particulier avec mes couches métiers et dao jusqu'à vouloir utiliser le lazy loading.
    Je m'explique : j'ai une entité membre qui contient entre autres un attribut infosPerso (qui est lui même une entité).
    Extrait de ma classe Membre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    @Entity
    public class Membre  extends DomainObject {
    	private static final long serialVersionUID = -80426809311125204L;
     
    	@Id
    	private String membreId;
     
    	@Temporal(TemporalType.DATE)
    	private Date dateNaissance;
    	private Character sexe;
    	private String password;
    	private String codeIdentification;
     
    	@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    	@JoinColumn(unique=true, nullable=true)
    	private InfosPerso infosPerso;
     
    //Getters and setters
    Le problème arrive quand je tente d'accéder à l'attribut infosPerso de la classe membre : j'ai une belle exception de LazyLoading :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    [...]
    Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
    	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
    	at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:191)
    	at fr.statlife.protoE4N.data.entites.InfosPerso_$$_javassist_0.toString(InfosPerso_$$_javassist_0.java)
    	at java.lang.String.valueOf(String.java:2826)
    	at java.lang.StringBuilder.append(StringBuilder.java:115)
    	at org.apache.wicket.util.lang.PropertyResolver$MethodGetAndSet.getValue(PropertyResolver.java:1121)
    	at org.apache.wicket.util.lang.PropertyResolver$ObjectAndGetSetter.getValue(PropertyResolver.java:642)
    	at org.apache.wicket.util.lang.PropertyResolver.getValue(PropertyResolver.java:101)
    	at org.apache.wicket.model.AbstractPropertyModel.getObject(AbstractPropertyModel.java:130)
    	at org.apache.wicket.Component.getDefaultModelObject(Component.java:1724)
    	at org.apache.wicket.Component.getDefaultModelObjectAsString(Component.java:1743)
    	at org.apache.wicket.markup.html.form.FormComponent.getModelValue(FormComponent.java:1377)
    	at org.apache.wicket.markup.html.form.FormComponent.getValue(FormComponent.java:879)
    	at org.apache.wicket.markup.html.form.TextField.onComponentTag(TextField.java:106)
    	at org.apache.wicket.Component.renderComponent(Component.java:2661)
    	at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    	at org.apache.wicket.Component.render(Component.java:2521)
    	at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1441)
    	at org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1604)
    	at org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1528)
    	at org.apache.wicket.markup.html.form.Form.onComponentTagBody(Form.java:2012)
    	at org.apache.wicket.Component.renderComponent(Component.java:2690)
    	... 65 more
    J'ai vu sur le forum stackoverflow quelqu'un qui disait:
    The cleanest solution I found was to use Spring's OpenEntityManagerInViewFilter (there's an OpenSessionInViewFilter for Hibernate) -- a simple servlet filter you drop in to web.xml (ahead of your other servlet filters), and Spring will automatically create a thread-safe, transaction-aware Session per-HTTP-request. No more LazyInitializationException!
    Mais mon fichier web.xml contient déjà le filtre OpenEntityManagerInViewFilter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	<!-- Open session in view -->
    	<filter>
    		<filter-name>osiv</filter-name>
    		<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
    	</filter>
    J'en déduis qu'il y a un truc à faire ailleurs, mais je sais pas où...
    Si quelqu'un a une piste, ça serait chouette

  2. #2
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Bonjour,

    Est ce que la stacktrace complète contient le OpenEntityManagerInViewFilter ?

    Si ce n'est pas le cas c'est peut être juste un problème de "filter mapping "

  3. #3
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    Voici la stacktrace complète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    org.apache.wicket.WicketRuntimeException: Exception in rendering component: [MarkupContainer [Component id = infosPersoForm]]
    	at org.apache.wicket.Component.renderComponent(Component.java:2729)
    	at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    	at org.apache.wicket.Component.render(Component.java:2521)
    	at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1441)
    	at org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1604)
    	at org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1528)
    	at org.apache.wicket.Component.renderComponent(Component.java:2690)
    	at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    	at org.apache.wicket.Component.render(Component.java:2521)
    	at org.apache.wicket.MarkupContainer.autoAdd(MarkupContainer.java:229)
    	at org.apache.wicket.markup.resolver.MarkupInheritanceResolver.resolve(MarkupInheritanceResolver.java:66)
    	at org.apache.wicket.markup.resolver.ComponentResolvers.resolve(ComponentResolvers.java:81)
    	at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1445)
    	at org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1604)
    	at org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1528)
    	at org.apache.wicket.Component.renderComponent(Component.java:2690)
    	at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    	at org.apache.wicket.Component.render(Component.java:2521)
    	at org.apache.wicket.MarkupContainer.autoAdd(MarkupContainer.java:229)
    	at org.apache.wicket.markup.resolver.MarkupInheritanceResolver.resolve(MarkupInheritanceResolver.java:73)
    	at org.apache.wicket.markup.resolver.ComponentResolvers.resolve(ComponentResolvers.java:81)
    	at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1445)
    	at org.apache.wicket.MarkupContainer.renderAll(MarkupContainer.java:1555)
    	at org.apache.wicket.Page.onRender(Page.java:1594)
    	at org.apache.wicket.Component.render(Component.java:2521)
    	at org.apache.wicket.Page.renderPage(Page.java:932)
    	at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.respond(BookmarkablePageRequestTarget.java:261)
    	at org.apache.wicket.request.AbstractRequestCycleProcessor.respond(AbstractRequestCycleProcessor.java:105)
    	at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1258)
    	at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
    	at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1436)
    	at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
    	at org.apache.wicket.protocol.http.MockWebApplication.processRequestCycle(MockWebApplication.java:527)
    	at org.apache.wicket.util.tester.BaseWicketTester.executeListener(BaseWicketTester.java:262)
    	at org.apache.wicket.util.tester.BaseWicketTester.clickLink(BaseWicketTester.java:897)
    	at org.apache.wicket.util.tester.BaseWicketTester.clickLink(BaseWicketTester.java:724)
    	at fr.statlife.protoE4N.wicket.TestStory07.testStory07_TA1(TestStory07.java:77)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
    	at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    	at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
    	at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
    	at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:191)
    	at fr.statlife.protoE4N.data.entites.InfosPerso_$$_javassist_0.toString(InfosPerso_$$_javassist_0.java)
    	at java.lang.String.valueOf(String.java:2826)
    	at java.lang.StringBuilder.append(StringBuilder.java:115)
    	at org.apache.wicket.util.lang.PropertyResolver$MethodGetAndSet.getValue(PropertyResolver.java:1121)
    	at org.apache.wicket.util.lang.PropertyResolver$ObjectAndGetSetter.getValue(PropertyResolver.java:642)
    	at org.apache.wicket.util.lang.PropertyResolver.getValue(PropertyResolver.java:101)
    	at org.apache.wicket.model.AbstractPropertyModel.getObject(AbstractPropertyModel.java:130)
    	at org.apache.wicket.Component.getDefaultModelObject(Component.java:1724)
    	at org.apache.wicket.Component.getDefaultModelObjectAsString(Component.java:1743)
    	at org.apache.wicket.markup.html.form.FormComponent.getModelValue(FormComponent.java:1377)
    	at org.apache.wicket.markup.html.form.FormComponent.getValue(FormComponent.java:879)
    	at org.apache.wicket.markup.html.form.TextField.onComponentTag(TextField.java:106)
    	at org.apache.wicket.Component.renderComponent(Component.java:2661)
    	at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    	at org.apache.wicket.Component.render(Component.java:2521)
    	at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1441)
    	at org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1604)
    	at org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1528)
    	at org.apache.wicket.markup.html.form.Form.onComponentTagBody(Form.java:2012)
    	at org.apache.wicket.Component.renderComponent(Component.java:2690)
    	... 65 more
    pas de trace de l'OpenEntityManagerInViewFilter dedans.

    Mais vu que je pense que le web.xml est bon car j'ai utilisé un archetype maven pour créer le projet, et que je n'ai pas touché au web.xml après...
    M'enfin, sait-on jamais... Voici le web.xml entier, si jamais tu vois un truc qui cloche dedans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    	version="2.4">
     
    	<display-name>Prototype E4N</display-name>
     
    	<!-- Open session in view -->
    	<filter>
    		<filter-name>osiv</filter-name>
    		<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
    	</filter>
     
    	<filter-mapping>
    		<filter-name>osiv</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
     
    	<filter>
    		<filter-name>wicket.WicketWarp</filter-name>
    		<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
    		<init-param>
    			<param-name>applicationClassName</param-name>
    			<param-value>fr.statlife.protoE4N.WicketApplication</param-value>
    		</init-param>
    	</filter>
     
    	<filter-mapping>
    		<filter-name>wicket.WicketWarp</filter-name>
    		<url-pattern>/*</url-pattern>
    		<dispatcher>REQUEST</dispatcher>
    		<dispatcher>ERROR</dispatcher>
    	</filter-mapping>
     
    	<error-page>
    		<error-code>404</error-code>
    		<location>/error404</location>
    	</error-page>
     
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>classpath:applicationContext.xml</param-value>
    	</context-param>
    	<listener>
    		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>
     
     
    </web-app>

  4. #4
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Ah mais tu rencontres le problème pendant l'exécution de tes tests JUnit !

    Les filtres sont normalement appelés par le container JEE avant de passer une requête à la servlet. C'est donc "logique" qu'il n'y ai pas de session rattachée puisque le filtre n'est pas utilisé pendant le test.

    Une solution serait peut être de reproduire le comportement du filtre (gérer la session) avant et après l'exécution des tests.
    Mais il y a peut être une façon plus élégante de le faire avec Spring et/ou JUnit.

  5. #5
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    euh oui, mais pas que : j'ai le même problème en testant l'appli manuellement. Sauf que cette fois, l'OpenEntityManagerInViewFilter apparait dans la stacktrace
    voici la stacktrace complète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    WicketMessage: Exception in rendering component: [MarkupContainer [Component id = infosPersoForm]]
     
    Root cause:
     
    org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:191)
    at fr.statlife.protoE4N.data.entites.InfosPerso_$$_javassist_0.toString(InfosPerso_$$_javassist_0.java)
    at java.lang.String.valueOf(String.java:2826)
    at java.lang.StringBuilder.append(StringBuilder.java:115)
    at org.apache.wicket.util.lang.PropertyResolver$MethodGetAndSet.getValue(PropertyResolver.java:1121)
    at org.apache.wicket.util.lang.PropertyResolver$ObjectAndGetSetter.getValue(PropertyResolver.java:642)
    at org.apache.wicket.util.lang.PropertyResolver.getValue(PropertyResolver.java:101)
    at org.apache.wicket.model.AbstractPropertyModel.getObject(AbstractPropertyModel.java:130)
    at org.apache.wicket.Component.getDefaultModelObject(Component.java:1724)
    at org.apache.wicket.Component.getDefaultModelObjectAsString(Component.java:1743)
    at org.apache.wicket.markup.html.form.FormComponent.getModelValue(FormComponent.java:1377)
    at org.apache.wicket.markup.html.form.FormComponent.getValue(FormComponent.java:879)
    at org.apache.wicket.markup.html.form.TextField.onComponentTag(TextField.java:106)
    at org.apache.wicket.Component.renderComponent(Component.java:2661)
    at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    at org.apache.wicket.Component.render(Component.java:2521)
    at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1441)
    at org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1604)
    at org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1528)
    at org.apache.wicket.markup.html.form.Form.onComponentTagBody(Form.java:2012)
    at org.apache.wicket.Component.renderComponent(Component.java:2690)
    at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    at org.apache.wicket.Component.render(Component.java:2521)
    at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1441)
    at org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1604)
    at org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1528)
    at org.apache.wicket.Component.renderComponent(Component.java:2690)
    at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    at org.apache.wicket.Component.render(Component.java:2521)
    at org.apache.wicket.MarkupContainer.autoAdd(MarkupContainer.java:229)
    at org.apache.wicket.markup.resolver.MarkupInheritanceResolver.resolve(MarkupInheritanceResolver.java:66)
    at org.apache.wicket.markup.resolver.ComponentResolvers.resolve(ComponentResolvers.java:81)
    at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1445)
    at org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1604)
    at org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1528)
    at org.apache.wicket.Component.renderComponent(Component.java:2690)
    at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    at org.apache.wicket.Component.render(Component.java:2521)
    at org.apache.wicket.MarkupContainer.autoAdd(MarkupContainer.java:229)
    at org.apache.wicket.markup.resolver.MarkupInheritanceResolver.resolve(MarkupInheritanceResolver.java:73)
    at org.apache.wicket.markup.resolver.ComponentResolvers.resolve(ComponentResolvers.java:81)
    at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1445)
    at org.apache.wicket.MarkupContainer.renderAll(MarkupContainer.java:1555)
    at org.apache.wicket.Page.onRender(Page.java:1594)
    at org.apache.wicket.Component.render(Component.java:2521)
    at org.apache.wicket.Page.renderPage(Page.java:932)
    at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.respond(BookmarkablePageRequestTarget.java:261)
    at org.apache.wicket.request.AbstractRequestCycleProcessor.respond(AbstractRequestCycleProcessor.java:105)
    at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1258)
    at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
    at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1436)
    at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
    at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:486)
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:319)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:440)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:926)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
     
    Complete stack:
     
    org.apache.wicket.WicketRuntimeException: Exception in rendering component: [MarkupContainer [Component id = infosPersoForm]]
    at org.apache.wicket.Component.renderComponent(Component.java:2729)
    at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    at org.apache.wicket.Component.render(Component.java:2521)
    at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1441)
    at org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1604)
    at org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1528)
    at org.apache.wicket.Component.renderComponent(Component.java:2690)
    at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    at org.apache.wicket.Component.render(Component.java:2521)
    at org.apache.wicket.MarkupContainer.autoAdd(MarkupContainer.java:229)
    at org.apache.wicket.markup.resolver.MarkupInheritanceResolver.resolve(MarkupInheritanceResolver.java:66)
    at org.apache.wicket.markup.resolver.ComponentResolvers.resolve(ComponentResolvers.java:81)
    at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1445)
    at org.apache.wicket.MarkupContainer.renderComponentTagBody(MarkupContainer.java:1604)
    at org.apache.wicket.MarkupContainer.onComponentTagBody(MarkupContainer.java:1528)
    at org.apache.wicket.Component.renderComponent(Component.java:2690)
    at org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1539)
    at org.apache.wicket.Component.render(Component.java:2521)
    at org.apache.wicket.MarkupContainer.autoAdd(MarkupContainer.java:229)
    at org.apache.wicket.markup.resolver.MarkupInheritanceResolver.resolve(MarkupInheritanceResolver.java:73)
    at org.apache.wicket.markup.resolver.ComponentResolvers.resolve(ComponentResolvers.java:81)
    at org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1445)
    at org.apache.wicket.MarkupContainer.renderAll(MarkupContainer.java:1555)
    at org.apache.wicket.Page.onRender(Page.java:1594)
    at org.apache.wicket.Component.render(Component.java:2521)
    at org.apache.wicket.Page.renderPage(Page.java:932)
    at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.respond(BookmarkablePageRequestTarget.java:261)
    at org.apache.wicket.request.AbstractRequestCycleProcessor.respond(AbstractRequestCycleProcessor.java:105)
    at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1258)
    at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
    at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1436)
    at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
    at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:486)

  6. #6
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Oui en effet, il doit y avoir autre chose !

    Je ne sais pas si tu gères tes transactions à la main ou si tu laisses le container le faire mais il est possible que ton EntityManager soit fermé lorsque ta transaction se termine (et je suppose que c'est le cas vu que tu as le problème dans ta vue et la transaction doit se terminer quand tu as fini le traitement du modèle).

    A ce moment là, il faut changer le type du PersistenceContext en EXTENDED (il est en TRANSACTION par défaut) pour que l'entity manager reste ouvert après la transaction.

  7. #7
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    oui, ce n'est pas la première fois que je lis cette solution, mais la grande question c'est où est ce que je peux modifier ce type?
    Dans le fichier de configuration de spring, j'ai essayé d'ajouter une property à mon bean entityManagerFactory, mais l'autocomplétion n'en propose pas avec ce nom là...
    Lors de mes recherches internet, j'ai vu que certains disaient de le renseigner dans l'annotation @PersistenceContext mais je n'utilise pas cette annotation dans mon code. Si c'est un oubli de ma part, il faut que je l'ajoute à quel niveau? (couche dao, métier, les deux?)

    voici mon fichier de conf de spring (au cas où ça pourrait aider) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    <?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:tx="http://www.springframework.org/schema/tx"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
    	default-autowire="byName">
     
    	<bean id="entityManagerFactory"
    		class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    		<property name="persistenceUnitName" value="jpaUnitProtoE4N" />
    	</bean>
     
    	<!--
    		enable the configuration of transactional behavior based on
    		annotations
    	-->
    	<tx:annotation-driven transaction-manager="transactionManager" />
     
    	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    		<property name="entityManagerFactory" ref="entityManagerFactory" />
    	</bean>
     
    	<!-- Declaration des dao -->	
    	<bean id="membreDao" class="fr.statlife.protoE4N.data.dao.jpa.MembreDaoImpl">
    		<property name="entityManagerFactory" ref="entityManagerFactory" />
    	</bean>
     
    	<bean id="daoLienE4N" class="fr.statlife.protoE4N.data.dao.jpa.LienBaseE4NDaoImpl">
    		<property name="entityManagerFactory" ref="entityManagerFactory" />
    	</bean>
     
    	<bean id="infosPersoDao" class="fr.statlife.protoE4N.data.dao.jpa.InfosPersoDaoImpl">
    		<property name="entityManagerFactory" ref="entityManagerFactory" />
    	</bean>
     
    	<!-- Déclaration des services -->
    	<bean id="serviceIdentif" class="fr.statlife.protoE4N.metier.ServiceIdentificationImpl" >
    		<property name="daoMembre" ref="membreDao"></property>
    	</bean>
     
    	<bean id="serviceInscription" class="fr.statlife.protoE4N.metier.ServiceInscriptionImpl" >
    		<property name="daoMembre" ref="membreDao"></property>
    		<property name="daoLienE4N" ref="daoLienE4N"></property>
    	</bean>
     
    	<bean id="serviceMembre" class="fr.statlife.protoE4N.metier.ServiceMembreImpl">
    		<property name="daoMembre" ref="membreDao"></property>
    	</bean>
     
    	<bean id="serviceLienE4N" class="fr.statlife.protoE4N.metier.ServiceLienBaseE4NImpl" >
    		<property name="lienE4NDao" ref="daoLienE4N"></property>
    	</bean>
     
    	<bean id="serviceInfosPerso" class="fr.statlife.protoE4N.metier.ServiceInfosPersoImpl" >
    		<property name="daoInfosPerso" ref="infosPersoDao"></property>
    	</bean>
     
    	<!-- Initialisation de la BD -->
    	<bean id="initData" class="fr.statlife.protoE4N.DataInitialiser" init-method="dataInit">
    		<property name="serviceMembre" ref="serviceMembre"></property>
    		<property name="serviceLienBaseE4N" ref="serviceLienE4N"></property>
    	</bean>
     
     
    </beans>

  8. #8
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Je t'avoue que je n'ai jamais eu l'occasion d'utiliser Spring et JPA en utilisant beaucoup la configuration XML.

    En revanche en utilisant les annotations il suffit de mettre un @Repository sur le DAO et un @PersistenceContext sur l'attribut EntityManager pour qu'il soit automatiquement injecté. Après tu peux l'utiliser normalement dans ton DAO.

    Edit: tu as un exemple de ce que je "connais" ici

  9. #9
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    merci pour le lien, je me plonge dedans

  10. #10
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    OK, je pense savoir d'où vient le problème.
    Comme je l'ai dit dans le premier message, j'ai créer mon projet à partir d'un archetype Maven proposé par Wicket permettant d'avoir un exemple de projet utilisant Wicket, Spring et JPA.
    Mais dans ce projet exemple, les Dao étendent la classe JpaDaoSupport et visiblement il n'est pas possible d'utiliser directement d'EntityManager avec (voir cette discussion sur le forum Spring source community). D'après cette même discussion, il est carrément déconseillé d'utiliser JpaDaoSupport !

    Comme j'ai du temps avant la fin de mon sprint (j'étais en avance, ça tombe plutôt bien), je vais reprendre le code de mes Dao et de mes classes métier pour virer JpaDaoSupport, et utiliser les annotations plutôt le fichier de conf spring (encore merci pour le lien !).

    Merci pour ton aide -gma-, j'y vois bien plus claire maintenant

  11. #11
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    Juste pour confirmation : je viens de finir le refactoring de mes Dao et services en utilisant les annotations spring plutôt que le fichier de conf, et surtout, en n'utilisant plus JpaDaoSupport.
    Tout marche à merveille, lazy loading y compris !

    Et vive les annotations spring qui simplifient la vie en rendant le code bien plus lisible et maintenable (à mon goût)

    Pour le refactoring, il m'a suffit de suivre le tuto dont -gma- m'avait donné le lien. Je me permets juste de vous donner le lien vers l'article dans le nouveau blog vu qu'il a déménagé :
    Tuto Java Spring : mise en place de jpa manage par spring/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [mybatis] Gérer le lazy loading
    Par Snyper dans le forum Persistance des données
    Réponses: 0
    Dernier message: 18/08/2011, 10h06
  2. Lazy loading sur component
    Par El Saigneur dans le forum Hibernate
    Réponses: 2
    Dernier message: 03/11/2006, 10h30
  3. Lazy loading et fermeture de session hibernate
    Par BRAUKRIS dans le forum Hibernate
    Réponses: 3
    Dernier message: 20/07/2006, 13h08
  4. [hibernate] problème pour desactiver le lazy loading
    Par agougeon dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/03/2006, 11h20
  5. [HIBERNATE 3]Lazy loading
    Par SEMPERE Benjamin dans le forum Hibernate
    Réponses: 11
    Dernier message: 08/02/2006, 22h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo