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)
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
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 + "]"; } }
Il y a donc une cle etrangere dans la table Message vers la table User (User_ID)
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 + "]"; } }
Classe UserDAOImpl
J ai ajouter une methode static pour avoir la liste des users car dans ma jsp j affiche une liste deroulante des users...
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 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
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 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; } }
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 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; } }
hibernate.cfg.xml (configuration de ma bd)
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; } }
struts.xml
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
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>
L ajout de message relatif a un user ne marche pas...
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>
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
Merci d avance... ca doit pas etre une grosse erreur je pense...
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>
Partager