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

Struts 2 Java Discussion :

Spring/Struts2/Tiles2 problème d'injection de dependance


Sujet :

Struts 2 Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut Spring/Struts2/Tiles2 problème d'injection de dependance
    Bonjour,
    Après un long moment d'hésitation entre l'utilisation de EJB3/JSF ou Spring/Struts2 dans un projet JEE, j'ai décidé de tester les deux plateformes.
    J'ai commencé par Spring/Struts2 et je me suis retrouvé face au problème d'injection de Spring.
    le message d'erreur affiché est :

    StandardWrapperValve[default]: PWC1406 : servlet.service() pour le servlet default a émis une exception.
    java.lang.NullPointerException
    at com.example.action.LoginAction.save(LoginAction.java:47)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)


    Je suis pas un expert dans le domaine, mais j'ai cru comprendre que Spring n'a pas instancié la classe métier dans la classe action. le processus d'injection ne fonctionne pas, c'est qu'il y a un problème dans le fichier de configuration (injection par constructeur!!!!)
    ci dessous le code de mes trois classes, et le fichier de configuration qui génère l'erreur.

    LA CLASSE ACTION

    package com.example.action;

    import com.example.domain.Login;
    import com.example.service.LoginServ;
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionSupport;
    import java.util.List;

    public class LoginAction extends ActionSupport{
    private LoginServ loginservice;


    private List<Login> logins;
    private Login login;
    private Integer id;
    private String loginid;
    private String password;
    private String email;
    private String address;
    private Integer phno;


    @Override
    public String execute() {
    this.logins = loginservice.findAll();
    return Action.SUCCESS;
    }

    public String save() {
    login=new Login();
    login.setId(this.id);
    login.setAddress(this.address);
    login.setLoginid(this.loginid);
    login.setPassword(this.password);
    login.setPhno(this.phno);
    login.setEmail(this.email);
    System.out.println(login.toString());
    loginservice.save(login);
    // this.login = new Login();
    return execute();
    }

    public String remove() {
    loginservice.remove(id);
    return execute();
    }

    public LoginServ getLoginservice() {
    return loginservice;
    }

    public void setLoginservice(LoginServ loginservice) {
    this.loginservice = loginservice;
    }
    public String getAddress() {
    return address;
    }

    public void setAddress(String address) {
    this.address = address;
    }

    public String getEmail() {
    return email;
    }

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

    public String getLoginid() {
    return loginid;
    }

    public void setLoginid(String loginid) {
    this.loginid = loginid;
    }

    public String getPassword() {
    return password;
    }

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

    public Integer getPhno() {
    return phno;
    }

    public void setPhno(Integer phno) {
    this.phno = phno;
    }

    public List<Login> getLogins() {
    return logins;
    }

    public Integer getId() {
    return id;
    }

    public void setId(Integer id) {
    this.id = id;
    }

    public void prepare() throws Exception {
    if (id != null)
    login = loginservice.find(id);
    }

    public Login getLogin() {
    return login;
    }

    public void setLogin(Login login) {
    this.login = login;
    }

    }


    LA CLASSE METIER

    package com.example.service;

    import com.example.dao.LoginDao;
    import com.example.domain.Login;
    import java.util.List;
    import org.springframework.transaction.annotation.Transactional;

    @Transactional
    public class LoginServImpl implements LoginServ{
    private LoginDao logindao;

    public LoginDao getlogindao() {
    return logindao;
    }

    public void setlogindao(LoginDao logindao) {
    this.logindao = logindao;
    }
    public List<Login> findAll(){
    return logindao.findAll();
    }
    public void save(Login login){


    logindao.save(login);
    }
    public void remove(int id){
    logindao.remove(id);
    }
    public Login find(int id){
    return logindao.find(id) ;
    }

    }


    LE FICHIER DE CONFIGURATION APPLICATIONCONTEXTE
    Implementation de JPA: TOPLINK

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

    <beans default-autowire="autodetect">
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <!-- ========================= RESOURCE DEFINITIONS ========================= -->

    <!-- Configurer that replaces ${...} placeholders with values from a properties file -->
    <!-- (in this case, JDBC-related settings for the dataSource definition below) -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location"><value>/resources/jdbc.properties</value></property>
    </bean>

    <!-- Local DataSource that works in any environment -->
    <!-- Note that DriverManagerDataSource does not pool; it is not intended for production -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.ContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.TopLinkJpaVendorAdapter">
    <property name="showSql" value="true"/>
    <property name="generateDdl" value="true"/>
    <property name="databasePlatform" value="oracle.toplink.essentials.platform.database.HSQLPlatform"/>
    </bean>
    </property>
    <property name="loadTimeWeaver">
    <bean class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver"/>
    </property>
    </bean>


    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
    <property name="url"><value>${jdbc.url}</value></property>
    <property name="username"><value>${jdbc.username}</value></property>
    <property name="password"><value>${jdbc.password}</value></property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
    <property name="dataSource" ref="dataSource"/>
    </bean>



    <!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
    <!-- couches applicatives -->
    <bean id="logindao" class="com.example.dao.LoginDaoImpl"></bean>
    <bean id="loginservice" class="com.example.service.LoginServImpl">
    <property name="logindao" ref="logindao" />
    </bean>

    <!-- Email Service -->
    <bean id="mailbean" class="com.example.mail.SendMail">
    <property name="strSmtp"><value>127.0.0.1</value></property>
    </bean>

    <!-- actions -->

    <bean id="loginAction" class="com.example.action.LoginAction">
    <property name="loginservice" ref="loginservice" />
    </bean>
    </beans>


    J'ai essayé de mixer Stuts2 et JSF mais ça n'a pas marché et il n'y a pas assez de doc sur le net, dommmmmmmmmage

    Merci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 35
    Par défaut
    Je pense qu'il te faut un constructeur dans la class LoginAction pour pouvoir instancié l'objet private LoginServ loginservice.

    Dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public LoginAction(LoginServ service)
    {
          this.loginservice = service;
    }
    puis il te faut le mapper dans ton fichier de config applicationCaontext.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <bean id="nom de l'action dans le fichier struts.xml" scope="session"
            class="com.example.action.LoginAction">
            <constructor-arg ref="loginservice" />
        </bean>

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut
    D'abord merci pour cette réactivité, je m'attendais pas à ce que ça soit si rapide, merci.
    Concernant l'injection par constructeur je l'ai utilisée au premier lieu mais ça donne l'erreur suivante

    WebModule[/WebApplication10]PWC1270 : exception lors du démarrage du filtre struts2
    Action class [com.example.action.LoginAction] does not have a public no-arg constructor - action - file:/D:/downloads/JavaEE5_1.6/WebApplication10/build/web/WEB-INF/classes/struts.xml:33:85
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyAction(XmlConfigurationProvider.java:376)


    comme quoi on peut pas utiliser l'injection par constructeur dans ce cas de configuration, à savoir Struts2/Spring. Pourtant sur l'exemple
    http://struts.apache.org/2.0.11.2/do...-jpa-ajax.html
    ça a l'air de marcher.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 35
    Par défaut
    C'est étonnant car je l'utilise est ca fonctionne très bien, voir trop bien. Je m'explique, j'ai défini dans mon fichier application context uniquement ma premiere action utiliser pour se logger sur mon appli, puis par la suite la plupart de mes actions font appel à mes Dao donc implemente un constructeur avec un parametre est ca marche. ^^

    Action class [com.example.action.LoginAction] does not have a public no-arg constructor
    Je ne comprend pas, il te demande un constructeur sans argument ?
    Sinon au cas ou tu a bien inclus les lignes suivantes dans ton fichier web.xml

    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
    <filter>
            <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
            <filter-class>
                org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
            </filter-class>
        </filter>
     
        <filter-mapping>
            <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>
                org.apache.struts2.dispatcher.FilterDispatcher
            </filter-class>
        </filter>
     
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
        </listener>

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Par défaut
    Effectivement c est bizarre cette histoire de constructeur.
    Quand je fourni un constructeur sans arg (par defaut) et je rajoute les getter setter pour mon objet métier, l'application s'exécute normalement mais quand je soumis mon formulaire, il me dit que mon objet métier est "null".
    J'ai des doutes sur mon fichier applicationContext.
    Tellement que ça m'a soulé, j'ai commencé à regarder EJB3/JSF lol

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



    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />


    <!-- ========================= RESOURCE DEFINITIONS ========================= -->

    <!-- Configurer that replaces ${...} placeholders with values from a properties file -->
    <!-- (in this case, JDBC-related settings for the dataSource definition below) -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location"><value>/resources/jdbc.properties</value></property>
    </bean>

    <!-- Local DataSource that works in any environment -->
    <!-- Note that DriverManagerDataSource does not pool; it is not intended for production -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.ContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.TopLinkJpaVendorAdapter">
    <property name="showSql" value="true"/>
    <property name="generateDdl" value="true"/>
    <property name="databasePlatform" value="oracle.toplink.essentials.platform.database.HSQLPlatform"/>
    </bean>
    </property>
    <property name="loadTimeWeaver">
    <bean class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver"/>
    </property>
    </bean>


    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
    <property name="url"><value>${jdbc.url}</value></property>
    <property name="username"><value>${jdbc.username}</value></property>
    <property name="password"><value>${jdbc.password}</value></property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
    <property name="dataSource" ref="dataSource"/>
    </bean>



    <!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
    <!-- couches applicatives -->
    <bean id="logindao" class="com.example.dao.LoginDaoImpl"></bean>
    <bean id="loginservice" class="com.example.service.LoginServImpl">
    <property name="logindao" ref="logindao" />
    </bean>

    <!-- Email Service
    <bean id="mailbean" class="com.example.mail.SendMail">
    <property name="strSmtp"><value>127.0.0.1</value></property>
    </bean>
    -->
    <!-- actions -->
    <!--
    <bean id="loginAction" class="com.example.action.LoginAction">
    <property name="loginservice" ref="loginservice" />
    </bean>
    -->

    <bean id="loginAction" scope="session"
    class="com.example.action.LoginAction">
    <constructor-arg ref="loginservice" />
    </bean>

    </beans>

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 35
    Par défaut
    Tellement que ça m'a soulé, j'ai commencé à regarder EJB3/JSF lol
    Non, jeune padawan ne tombe pas du coté obscur de la force.

    Sinon plus sérieusement, je suis pas sur de mon coup mais tu peu test d'inclure directement ton dao comme argument sans passer par ta classe LoginServImpl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <bean id="logindao" class="com.example.dao.LoginDaoImpl"></bean>
    <bean id="loginservice" class="com.example.service.LoginServImpl">
    <property name="logindao" ref="logindao" />
    </bean>
    car ce morceau me parait louche...

Discussions similaires

  1. [Web Services] Problème d'injection de DAO avec Spring
    Par devTyty dans le forum Spring
    Réponses: 2
    Dernier message: 04/09/2014, 13h13
  2. Problème communication Spring Struts2
    Par PaulPersonne820 dans le forum Struts 2
    Réponses: 1
    Dernier message: 29/08/2012, 10h58
  3. Réponses: 4
    Dernier message: 25/05/2011, 09h23
  4. [Spring 2.5][Tiles2] problème de Configuration
    Par hkefi dans le forum Spring Web
    Réponses: 0
    Dernier message: 20/01/2009, 01h47
  5. Réponses: 1
    Dernier message: 04/02/2007, 23h40

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