Bonjour,

Je suis train de me familiariser avec Struts 2 et hibernate et je me retrouve face a un probleme lors de l ajout d un message dans ma base de donnee (methode post de ma jsp "addMessage.jsp") (null pointeur exception)

Pour voux expliquer plus precisement voici mon code.

Class User (Modele)
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
package com.vaannila.model;
 
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 org.hibernate.validator.Length;
import org.hibernate.validator.NotEmpty;
 
@Entity
@Table(name="USER")
public class User {
 
	private Long id;
	private String name;
	private String password;
	private String gender;
	private String country;
	private String aboutYou;
	private Boolean mailingList;
 
 
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name="USER_ID")
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	@NotEmpty
	@Length(max=50)
	@Column(name="USER_NAME")
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
 
	@Length(min=6, max=10)
	@Column(name="USER_PASSWORD")
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
 
	@NotEmpty(message="Please select a gender")
	@Column(name="USER_GENDER")
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
 
	@NotEmpty(message="Please select a country")
	@Column(name="USER_COUNTRY")
	public String getCountry() {
		return country;
	}
	public void setCountry(String country) {
		this.country = country;
	}
 
	@NotEmpty
	@Length(max=100)
	@Column(name="USER_ABOUT_YOU")
	public String getAboutYou() {
		return aboutYou;
	}
	public void setAboutYou(String aboutYou) {
		this.aboutYou = aboutYou;
	}
 
	@Column(name="USER_MAILING_LIST")
	public Boolean getMailingList() {
		return mailingList;
	}
	public void setMailingList(Boolean mailingList) {
		this.mailingList = mailingList;
	}
	@Override
	public String toString() {
		return "User [aboutYou=" + aboutYou + ", country=" + country
				+ ", gender=" + gender + ", id=" + id + ", mailingList="
				+ mailingList + ", name=" + name + ", password=" + password
				+ "]";
	}
}
Classe Message (modele)
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
package com.vaannila.model;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
 
@Entity
@Table(name="MESSAGE")
public class Message {
 
	@Id
	@GeneratedValue
	@Column(name="MESSAGE_ID")
	private Long id;
 
	@OneToOne
	@JoinColumn(name="USER_ID")
	private User user;
 
	@Column(name="MESSAGE")
	private String message;
 
 
 
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
 
 
	public User getUser() {
		return user;
	}
	public void setUserId(User user) {
		this.user = user;
	}
 
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
 
	@Override
	public String toString() {
		return "Message [id=" + id + ", User="
				+ user.toString() + ", message=" + message + "]";
	}
}
Il y a donc une cle etrangere dans la table Message vers la table User (User_ID)

Classe UserDAOImpl
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
 
package com.vaannila.dao;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
 
 
import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;
import com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory;
import com.vaannila.model.User;
 
public class UserDAOImpl implements UserDAO {
 
	@SessionTarget
	static
	Session session;
	@TransactionTarget
	Transaction transaction;
 
	     // Used to save or update a user.
 
	    @Override
	  public void saveOrUpdateUser(User user) {
	        try {
	            session.saveOrUpdate(user);
	        } catch (Exception e) {
	            transaction.rollback();
	            e.printStackTrace();
	        }
	    }
 
	  /**
             * Used to delete a user.
             */
	   @Override
	    public void deleteUser(Long userId) {
	        try {
	            User user = (User) session.get(User.class, userId);
	            session.delete(user);
	        } catch (Exception e) {
	            transaction.rollback();
	            e.printStackTrace();
	        }
	    }
 
	@SuppressWarnings("unchecked")
	@Override
	public List<User> listUser() {	
		List<User> courses = null;
		try {
			courses = session.createQuery("from User").list();
			/*System.out.println(courses);
			System.out.println("coucou");
			for (Iterator iter = (Iterator) courses.iterator(); iter.hasNext();) {
				System.out.println("test");
                User element = (User) iter.next();
                System.out.println("nom : " + element.toString());
            }*/
 
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return courses;
	}
 
	public static List<User> getUserList() throws Exception
	{
	Session session = HibernateSessionFactory.getSession();
	List<User> list = null;
	try{
	Query query=session.createQuery("from User u");
	list =query.list();
 
	}catch(Exception ex){
	ex.printStackTrace();
	}
	return list;
	} 
}
J ai ajouter une methode static pour avoir la liste des users car dans ma jsp j affiche une liste deroulante des users...

J utilise Session session = HibernateSessionFactory.getSession();
ai je vraiment le droit? est ce approprie? Je vois avoue que je ne suis pas un expert en session...

Classe MessageDAOImpl
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
 
 
package com.vaannila.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;
import com.vaannila.model.Message;
 
public class MessageDAOImpl implements MessageDAO {
 
	@SessionTarget
 
	Session session;
	@TransactionTarget
	Transaction transaction;
 
	     // Used to save or update a user.
 
	    @Override
	  public void saveOrUpdateMessage(Message m) {
	        try {
	            session.saveOrUpdate(m);
	        } catch (Exception e) {
	            transaction.rollback();
	            e.printStackTrace();
	        }
	    }
 
	  /**
             * Used to delete a user.
             */
	   @Override
	    public void deleteMessage(Long messageId) {
	        try {
	            Message m = (Message) session.get(Message.class, messageId);
	            session.delete(m);
	        } catch (Exception e) {
	            transaction.rollback();
	            e.printStackTrace();
	        }
	    }
	@SuppressWarnings("unchecked")
	@Override
	public List<Message> listMessage() {	
		List<Message> courses = null;
		try {
			courses = session.createQuery("from Message").list();
			System.out.println(courses);
			/*System.out.println("coucou");
			for (Iterator iter = (Iterator) courses.iterator(); iter.hasNext();) {
				System.out.println("test");
                User element = (User) iter.next();
                System.out.println("nom : " + element.toString());
            }*/
 
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return courses;
	}
 
    @Override
    public Message listMessageById(Long messageId) {
       Message m = null;
        try {
            m = (Message) session.get(Message.class, messageId);
        } catch (Exception e) {
            e.printStackTrace();
       }
        return m;
    }
 
}
ClasseUserAction
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
 
 
package com.vaannila.web;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.hibernate.validator.Valid;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.vaannila.dao.UserDAO;
import com.vaannila.dao.UserDAOImpl;
import com.vaannila.model.User;
 
public class UserAction extends ActionSupport implements ModelDriven<User> {
 
	private static final long serialVersionUID = -6659925652584240539L;
 
	@Valid
	private User user = new User();
	private List<User> userList = new ArrayList<User>();
	private UserDAO userDAO = new UserDAOImpl();
 
	@Override
	public User getModel() {
		return user;
	}
 
	public String saveOrUpdate()
	{
		System.out.println("coucou");
		System.out.println(user);
		userDAO.saveOrUpdateUser(user);
		System.out.println("coucou");
		return SUCCESS;
	}
 
	public String list()
	{
		userList = userDAO.listUser();
		return SUCCESS;
	}
 
	/**
             * To delete a user.
            * @return String
             */
	   public String delete()
	  {
	        HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get( ServletActionContext.HTTP_REQUEST);
	        userDAO.deleteUser(Long.parseLong( request.getParameter("id")));
	       return SUCCESS;
	   }
 
	    /**
             * To list a single user by Id.
             * @return String
             */
	   public String edit()
	    {
	        HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get( ServletActionContext.HTTP_REQUEST);
	        user = userDAO.listUserById(Long.parseLong( request.getParameter("id")));
	        return SUCCESS;
	    }
 
	public User getUser() {
		return user;
	}
 
	public void setUser(User user) {
		this.user = user;
	}
 
	public List<User> getUserList() {
		return userList;
	}
 
	public void setUserList(List<User> userList) {
		this.userList = userList;
	}
 
}
Classe MessageAction
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
 
 
package com.vaannila.web;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.hibernate.validator.Valid;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.vaannila.dao.MessageDAO;
import com.vaannila.dao.MessageDAOImpl;
import com.vaannila.model.Message;
 
 
public class MessageAction extends ActionSupport implements ModelDriven<Message> {
 
	private static final long serialVersionUID = -6659925652584240539L;
 
	@Valid
	private Message message = new Message();
	private List<Message> messageList = new ArrayList<Message>();
	private MessageDAO messageDAO = new MessageDAOImpl();
 
 
	@Override
	public Message getModel() {
		return message;
	}
 
	public String saveOrUpdate()
	{
		System.out.println("coucou");
		System.out.println(messageDAO);
		System.out.println("coucou");
		System.out.println(message);
		messageDAO.saveOrUpdateMessage(message);
		return SUCCESS;
	}
 
	public String list()
	{
		messageList = messageDAO.listMessage();
		return SUCCESS;
	}
 
	/**
             * To delete a Message.
            * @return String
             */
	   public String delete()
	  {
	        HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get( ServletActionContext.HTTP_REQUEST);
	        messageDAO.deleteMessage(Long.parseLong( request.getParameter("id")));
	       return SUCCESS;
	   }
 
	    /**
             * To list a single Message by Id.
             * @return String
             */
	   public String edit()
	    {
	        HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get( ServletActionContext.HTTP_REQUEST);
	        message = messageDAO.listMessageById(Long.parseLong( request.getParameter("id")));
	        return SUCCESS;
	    }
 
	public Message getMessage() {
		return message;
	}
 
	public void setMessage(Message message) {
		this.message = message;
	}
 
	public List<Message> getMessageList() {
		return messageList;
	}
 
	public void setMessageList(List<Message> messageList) {
		this.messageList = messageList;
	}
 
}
hibernate.cfg.xml (configuration de ma bd)

struts.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
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
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
		<constant name="struts.enable.DynamicMethodInvocation" value="false" />
		  <constant name="struts.devMode" value="true" />
 
    <package name="default" extends="hibernate-default">
 
        <action name="addUser" class="com.vaannila.web.UserAction">
			<result>/addUser.jsp</result>
        </action>
 
		<action name="saveOrUpdateUser" method="saveOrUpdate" class="com.vaannila.web.UserAction">
			<result name="input">/addUser.jsp</result>
            <result name="success" type="redirect">listUser</result>
        </action>
 
		<action name="listUser" method="list" class="com.vaannila.web.UserAction">
			<interceptor-ref  name="basicStackHibernate" />
            <result name="success">/listUser.jsp</result>
        </action>
 
        <action name="editUser" method="edit" class="com.vaannila.web.UserAction">
			<result name="input">/addUser.jsp</result>
            <result name="success">/addUser.jsp</result>
        </action>
 
        <action name="deleteUser" method="delete" class="com.vaannila.web.UserAction">
			<result  name="input">/listUser.jsp</result>
            <result name="success" type="redirect">listUser</result>
        </action>
 
		<action name="addMessage" class="com.vaannila.web.MessageAction">
			<result>/addMessage.jsp</result>
        </action>
 
		<action name="saveOrUpdateMessage" method="saveOrUpdate" class="com.vaannila.web.MessageAction">
            <result name="input">/addMessage.jsp</result>
			<result name="success" type="redirect">listMessage</result>
        </action>
		<action name="listMessage" method="list" class="com.vaannila.web.MessageAction">
			<interceptor-ref  name="basicStackHibernate" />
            <result name="success">/listMessage.jsp</result>
        </action>
        <action name="editMessage" method="edit" class="com.vaannila.web.MessageAction">
			<result  name="input">/addMessage.jsp</result>
            <result name="success">/addMessage.jsp</result>
        </action>
        <action name="deleteMessage" method="delete" class="com.vaannila.web.MessageAction">
			<result  name="input">/listMessage.jsp</result>
            <result name="success" type="redirect">listMessage</result>
        </action>
    </package>
</struts>
addMessage.jsp
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
 
<%@ page import="com.vaannila.model.User"%>
<%@ page import="com.vaannila.dao.UserDAOImpl"%>
<%@ page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Message Add</title>
<s:head />
<style type="text/css">import url(style.css);</style>
</head>
<body>
<s:actionerror/>
<s:form action="saveOrUpdateMessage" method="post">
        <s:hidden name="message.id" />
	<label> User</label>
        <select>
		<% Iterator<User> it = UserDAOImpl.getUserList().iterator();
		String s=null;
		while(it.hasNext()){
		User user =(User)it.next();
		s=user.getName();
		%>
		<option value="<%=user%>"> <%=user.getGender()+" "+user.getName()%></option>
		<%}%> 
		</select>
        <s:textfield name="message.message" label="Message" />
        <s:submit />
</s:form>
</body>
</html>
L ajout de message relatif a un user ne marche pas...
Je vois bien les users dans ma liste deroulante, lorsque je fait mon submit, j ai un null pointer exception dans "MessageAction" methode "saveOrUpdate" pour l attribut "message"...

Voila mon probleme

listMessage.jsp
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
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>List Message</title>
<s:head />
<style type="text/css">import url(style.css);</style>
</head>
<body>
<s:if test="messageList.size() > 0">
    <div class="content">
    <table class="messageTable" cellpadding="5px">
        <tr class="even">
           <th>Id User</th>
            <th>Message</th>
            <th>Edit</th>
           <th>Delete</th>
        </tr>
        <s:iterator value="messageList" status="messageStatus">
           <tr
                class="<s:if test="#messageStatus.odd == true ">odd</s:if> <s:else>even</s:else>">
                <td><s:property value="user" /></td>
                <td><s:property value="message" /></td>
                <td>
               <s:url id="editURL" action="editMessage">
                    <s:param name="id" value="%{id}"></s:param>
                </s:url>
                <s:a href="%{editURL}">Edit</s:a>
               </td>
                <td>
               <s:url id="deleteURL" action="deleteMessage">
                    <s:param name="id" value="%{id}"></s:param>
               </s:url>
                <s:a href="%{deleteURL}">Delete</s:a>
                </td>
            </tr>
      </s:iterator>
    </table>
    </div>
</s:if>
<a href="addMessage.action">Add Message</a><br>
<a href="/test/">Menu</a>
</body>
</html>
Merci d avance... ca doit pas etre une grosse erreur je pense...