Servlet.service() de la servlet jsp jeté exception java.lang.NullPointerException lors d'un appel bean EJB
Tout en appelant EJB bean sur ma page jsp, j'ai une erreur:
WARNING: StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw
exception java.lang.NullPointerException
at appjpa.ejb.UsersFacade.findAllStudents(UsersFacade.java:65)
at org.apache.jsp.Students_jsp._jspService(Students_jsp.java from :75)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:662)
Code de ma page jsp est telle:
<%@page import="appjpa.entities.Users"%>
<%@page import="java.util.ArrayList"%>
<%@page import="socnet2.Student"%> <!-- class Student emulates real student -->
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<jsp:useBean class="appjpa.ejb.UsersFacade" id="dao" scope="application"></jsp:useBean>
<p><b>List of all students:</b></p>
<form action="/AppJPA/Edit" method="POST">
<jsp:scriptlet>
int counter = 0; if (dao != null){
for (Users s : dao.findAllStudents()) {
</jsp:scriptlet>
<p> <jsp:expression> s.getName() + " " + s.getSurname()</jsp:expression></p>
<input type="submit" name="Edit_<%=counter%>" value="Edit" />
<input type="submit" name="Delete_<%=counter%>" value ="Delete"/>
<jsp:scriptlet>
counter++;
}}
</jsp:scriptlet>
<input type="submit" name="Add_new_student" value ="Add new student"/>
</form>
</body>
Généré automatiquement par NetBeans 7.0.1 assistant classe d'entité pour les utilisateurs ressemble:
@Entity
@Table(name = "USERS")
@NamedQueries({
@NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
@NamedQuery(name = "Users.findById", query = "SELECT u FROM Users u WHERE u.id = :id"),
@NamedQuery(name = "Users.findByName", query = "SELECT u FROM Users u WHERE u.name = :name"),
@NamedQuery(name = "Users.findBySurname", query = "SELECT u FROM Users u WHERE u.surname = :surname"),
@NamedQuery(name = "Users.findByLogin", query = "SELECT u FROM Users u WHERE u.login = :login"),
@NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password"),
@NamedQuery(name = "Users.findByRole", query = "SELECT u FROM Users u WHERE u.role = :role")})
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
//@NotNull
@Column(name = "ID")
private Integer id;
@Size(max = 40)
@Column(name = "NAME")
private String name;
@Size(max = 40)
@Column(name = "SURNAME")
private String surname;
@Size(max = 40)
@Column(name = "LOGIN")
private String login;
@Size(max = 40)
@Column(name = "PASSWORD")
private String password;
@Size(max = 40)
@Column(name = "ROLE")
private String role;
@ManyToMany(mappedBy = "usersList")
private List<SubjectGroup> subjectGroupList;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idCreator")
private List<SubjectGroup> subjectGroupList1;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idSender")
private List<Messages> messagesList;
public Users() {
}
public Users(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public List<SubjectGroup> getSubjectGroupList() {
return subjectGroupList;
}
public void setSubjectGroupList(List<SubjectGroup> subjectGroupList) {
this.subjectGroupList = subjectGroupList;
}
public List<SubjectGroup> getSubjectGroupList1() {
return subjectGroupList1;
}
public void setSubjectGroupList1(List<SubjectGroup> subjectGroupList1) {
this.subjectGroupList1 = subjectGroupList1;
}
public List<Messages> getMessagesList() {
return messagesList;
}
public void setMessagesList(List<Messages> messagesList) {
this.messagesList = messagesList;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
//TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Users)) {
return false;
}
Users other = (Users) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "appjpa.entities.Users[ id=" + id + " ]";
}
}
Et, finalement, la classe UsersFacade est telle:
@Stateless
public class UsersFacade extends AbstractFacade<Users> implements UsersFacadeLocal {
@PersistenceContext(unitName = "AppJPAPU")
private EntityManager em;
protected EntityManager getEntityManager() {
return em;
}
public UsersFacade() {
super(Users.class);
}
@Override
public Users checkInBase(String login, String password) {
Users u = (Users)(em.createNamedQuery("Users.findByLogin").setParameter("login", login).getSingleResult());
return u;
}
@Override
public void removeUserFromSubjectGroup(Users user, SubjectGroup group) {
Users u = em.find(Users.class, user.getId());
SubjectGroup g = em.find(SubjectGroup.class, group.getId());
if (u != null && g != null) {
user.getSubjectGroupList().remove((SubjectGroup)group);
group.getUsersList().remove(user);
em.merge(user);
em.merge(group);
}
}
@Override
public void addUserToSubjectGroup(Users user, SubjectGroup group) {
Users u = em.find(Users.class, user.getId());
SubjectGroup g = em.find(SubjectGroup.class, group.getId());
if (u != null && g != null) {
user.getSubjectGroupList().add((SubjectGroup)group);
group.getUsersList().add(user);
em.merge(user);
em.merge(group);
}
}
@Override
public List<Users> findAllStudents() {
String role = new String("student");
List<Users> students = (List<Users>)(em.createNamedQuery("SELECT u FROM Users u WHERE u.role = :role").setParameter("role", role).getResultList());
if (students == null){
System.out.println("Students are null!!!");
}
return students;
}
@Override
public boolean deleteStudent(Users user) {
Users u = em.find(Users.class, user.getId());
em.remove(user);
return true;
}
@Override
public boolean updateStudent(Users studentToEdit, String newName, String newSurname, String newLogin, String newPassword) {
Users u = em.find(Users.class, studentToEdit.getId());
u.setName(newName);
u.setSurname(newSurname);
u.setLogin(newLogin);
u.setPassword(newPassword);
em.merge(studentToEdit);
return true;
}
@Override
public void insertStudenttoDB(Users student, String newName, String newSurname, String newLogin, String newPassword) {
em.persist(student);
Users u = em.find(Users.class, student.getId());
if (u != null) {
student.setName(newName);
student.setSurname(newSurname);
student.setLogin(newLogin);
student.setPassword(newPassword);
em.merge(student);
}
}
}
Je suis tout à fait nouveau pour EJB et peut-être que je ne suis pas en utilisant leur droit. J'ai essayé d'appeler d'autres méthodes de UsersFaced à un autre pages, mais il a reçu le même message d'erreur. S'il vous plaît, expliquer ce que je fais de mal...
Vous devez vous connecter pour publier un commentaire.
La
@PersistenceContext
ne sera pas injecté si vous instancier manuellement un EJB classe comme un simple haricot de java dans les pages JSP par<jsp:useBean>
au lieu d'obtenir un conteneur de l'instance gérée par@EJB
. Je ne sais pas comment et où vous avez appris à écrire des pages Jsp de cette façon, mais c'est undoubtely basé sur un très obsolète livre/tutoriel. Vous avez besoin de faire des changements drastiques dans votre modèle-vue-sans-contrôleur d'approche. Vous avez besoin d'ajouter un contrôleur. Jeter toutes ces<jsp:xxx>
tags loin et de créer une Servlet qui agit comme un véritable régulateur.E. g.
Remarque que j'ai déplacé votre JSP dans
/WEB-INF
dossier de sorte qu'il n'est pas possible soit de façon volontaire ou accidentelle de l'invoquer sans appel de la servlet.Maintenant, changer votre page JSP comme suit:
De l'ouvrir par la servlet URL http://localhost:8080/AppJPA/students de sorte que son
doGet()
va pour le droit du travail et que la JSTL<c:forEach>
va se répéter surusers
en conséquence.J'ai par la façon dont mes doutes sur la façon dont vous avez nommé les boutons. L'identification de l'utilisateur sélectionné serait très maladroit. Mais c'est un sujet pour une autre question.
Voir aussi:
Si c'est l'ensemble de votre pack de requêtes nommées que je suppose que ce code:
est foiré. Vous essayez de créer nommé requête dont le nom est égal à
SELECT u FROM Users u WHERE u.role = :role
.Vous avez des requêtes nommées définis dans votre
Users
l'annotation et l'on vous essayez d'utiliser est celui-ci:Par conséquent, vous devez utiliser le nom de
Users.findByRole
. En outre, vous n'avez pas besoin de jeter àList<Users>
comme il y a un la méthode la plus appropriée paramètre pour définir le type de résultat. Il devrait être plutôt:Il y a peu de mauvaises pratiques dans votre code comme:
User
queUsers
,<jsp:scriptlet>
n'en est pas mieux.