Injection avec spring

alen3 Messages postés 49 Date d'inscription mercredi 4 janvier 2012 Statut Membre Dernière intervention 24 novembre 2012 - 23 févr. 2012 à 21:09
alen3 Messages postés 49 Date d'inscription mercredi 4 janvier 2012 Statut Membre Dernière intervention 24 novembre 2012 - 6 mars 2012 à 12:14
salut,

je suis entrain de faire une application avec struts2 + EJB3

et j'ai déjà avancé dans ce projet

mais le problème est que je suis dans l'obligation d'ajouter la notion d'injection par spring (en utilisant le design pattern service locator et IOC)

mais je n'arrive pas à intégrer ce concept dans mon projet

pour le moment dans mon projet web j’écris ce code dans la class UserAction.java
 
public class UserAction extends ActionSupport{
private UserDaoRemote userDao;
 
public UserDaoRemote getUserDao() {
return userDao;
}
 
public void setUserDao(UserDaoRemote userDao) {
this.userDao = userDao;
}
 
 
 public UserAction() {
    	try {
Context context=new InitialContext();
setUserDao((UserDaoRemote) context.lookup("test"));//ici normalement introduit la notion d'injection
 
 
} catch (Exception e) {
e.printStackTrace();
}
    } 
 
}


merci d'avance

3 réponses

alen3 Messages postés 49 Date d'inscription mercredi 4 janvier 2012 Statut Membre Dernière intervention 24 novembre 2012
26 févr. 2012 à 15:20
pour le moment j'arrive à faire une page jsp qui affiche les listes des utilisateurs en utilisant seulement EJB3 et struts2

pour le projet EJB : on a l'interface UserDaoRemote
@Remote
public interface UserDaoRemote {

public void add(User user);
public void update(User user);
public void delete(User user);
public List lisAll();




}

et pour la classe UserDao :

@Stateful(mappedName= "test")
public class UserDao implements UserDaoRemote{



@PersistenceContext
EntityManager entityManager;

public void add(User user) {

entityManager.persist(user);

}


public void delete(User user) {

user=entityManager.merge(user);
entityManager.remove(user);
}


public List lisAll() {


return entityManager.createNamedQuery("User.FindAll").getResultList();
}


public void update(User user) {



entityManager.merge(user);

}



}

et pour le projet WEB (avec struts2)

public class UserAction extends ActionSupport{
private UserDaoRemote userDao;
private List users;
public List getUsers() {
return users;
}

public void setUsers(List users) {
this.users = users;
}
public UserDaoRemote getUserDao() {
return userDao;
}

public void setUserDao(UserDaoRemote userDao) {
this.userDao = userDao;
}


public UserAction() {
try {
Context context=new InitialContext();
setUserDao((UserDaoRemote) context.lookup("test"));//ici normalement introduit la notion d'injection


} catch (Exception e) {
e.printStackTrace();
}
}


public String getAllUsers(){


users=userDao.lisAll();

return "success";
}

}

et pour le fichier struts.xml







users.jsp









et dans la page jsp juste je fait appel à l'action :getAllUser











|
|


----

,
,









bien sur l'exemple qui j'ai donné ca marche juste je veux ajouter dans cet exemple la notion d'injection avec spring

j’espère que vous pouvez m'aidez dans cette exemple et par la suite je peux continuer dans le reste de projet avec même principe



je pense que juste je dois Importer les JAR de Spring, et crée un fichier context.xml dans lequel je déclarerais mes beans
avec le principe suivant






donc je veux savoir le contenu complet de fichier context.xml

merci d'avance
alen3 Messages postés 49 Date d'inscription mercredi 4 janvier 2012 Statut Membre Dernière intervention 24 novembre 2012
1 mars 2012 à 08:41
je pense Si je veux passer à Spring, je dois créer un fichier de context en lui ajoutant seulement la base <context:scan-base-package="la liste de mes packages avec une virgule pour les séparer"/> et sur toutes les classes que ju souhaites que Spring gère le cycle de vie tu leur ajoute l'annotation @Component et c'est fait.

donc pour la class class UserAction

 
@Component
public class UserAction extends ActionSupport{
private UserDaoRemote userDao;
 private List users;
public List getUsers() {
return users;
}
 
public void setUsers(List users) {
this.users = users;
}
public UserDaoRemote getUserDao() {
return userDao;
}
 
public void setUserDao(UserDaoRemote userDao) {
this.userDao = userDao;
}
 
 
 public UserAction() {
    	try {
Context context=new InitialContext();
setUserDao((UserDaoRemote) context.lookup("test"));//ici normalement introduit la notion d'injection
 
 
} catch (Exception e) {
e.printStackTrace();
}
    } 
 
 
public String getAllUsers(){
 
 
users=userDao.lisAll();
 
    	 return "success";
    }
 
}


et pour le fichier context.xml

   <context:component-scan base-package="package com.test.action,com.testEJB.daos"/>
 


a noter que le package :
com.testEJB.daos


est dans le projet EJB

comme je dis le but est comment utiliser spring avec le projet que j'ai déjà
donné
alen3 Messages postés 49 Date d'inscription mercredi 4 janvier 2012 Statut Membre Dernière intervention 24 novembre 2012
6 mars 2012 à 12:14
vraiment je suis bloqué dans cet étape malgrés les recherches dans les tutos de spring

comme je dis j'arrive à faire tourner une projet JEE en utilisant EJB3 et struts2

le nom de projet EJB s'appel : projetTestEJB et le nom de projet WEB avec struts2 s'appel : projetStruts2

mais le problème actuel est comment faire l'injection (normalement l'injection des EJB) en utilisant spring

en suivant l'annotation de spring

j'ajoute @Component dans la class UserAction
@Component
public class UserAction extends ActionSupport{
private UserDaoRemote userDao;
private List users;
public List getUsers() {
return users;
}

public void setUsers(List users) {
this.users = users;
}
public UserDaoRemote getUserDao() {
return userDao;
}

public void setUserDao(UserDaoRemote userDao) {
this.userDao = userDao;
}


public UserAction() {
try {
Context context=new InitialContext();
setUserDao((UserDaoRemote) context.lookup("test"));


} catch (Exception e) {
e.printStackTrace();
}
}


public String getAllUsers(){


users=userDao.lisAll();

return "success";
}

}



dans cet class j'essaye d'utiliser lannotation @EJB mais ca marche pas

c'est pour cela j'utilise InitialContext. ( et ca marche parfaitement)

et pour le fichier web.xml :




projetStruts2


struts2
org.apache.struts2.dispatcher.FilterDispatcher



struts2
/*



index.jsp





org.springframework.web.context.ContextLoaderListener





mais est ce que avec ce changement je peux dire que j’utilise spring pour faire l'injection

autre chose je pense que ces ligne devront être changer


try {
Context context =new InitialContext();
setUserDao((UserDaoRemote) context.lookup("test"));


} catch (Exception e) {
e.printStackTrace();
}

on pas par @EJB mais je doit passer par spring






autre tentative de test que j'ai déjà fait qui est différent à la précédente

je cree un fichier xml

context.xml :

















et pour la class UserAction

public class UserAction extends ActionSupport{
private UserDaoRemote userDao;
private List users;
public List getUsers() {
return users;
}

public void setUsers(List users) {
this.users = users;
}
public UserDaoRemote getUserDao() {
return userDao;
}

public void setUserDao(UserDaoRemote userDao) {
this.userDao = userDao;
}


public UserAction() {
try {
String fichier[]={"context.xml"};
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(fichier);

userDao= (UserDaoRemote) context.getBean("userDao");
} catch (Exception e) {
e.printStackTrace();
}
}


public String getAllUsers(){


users=userDao.lisAll();

return "success";
}

}

mais ca marche pas

l'erreur est :
null pointer exception

au niveau de cet ligne

users=userDao.lisAll();
Rejoignez-nous