Piszę aplikacje webową pod NetBeansem ( ejb, jpa, jsf, glassfish ) z wykorzystaniem bazy Postgres oraz architektury MVC. Normalne wyświetlanie elementów z bazy przebiega bezproblemowo. Ale gdy chce wykonać takie zapytanie:
encja user.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package pl.kkp.entities;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
/**
*
* @author DoM
*/
@Entity
@Table(name = "users")
@NamedQueries({
@NamedQuery(name = "User.findAll",
query = "SELECT u FROM User u"),
@NamedQuery(name = "User.findByLoginAndPass",
query = "SELECT u FROM User u WHERE u.login = :l AND u.password = :p ")
})
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Column(name = "login")
private String login;
@Column(name = "password")
private String password;
@Column(name = "auth_level")
private Short authLevel;
@Column(name = "is_active")
private String isActive;
@JoinColumn(name = "id_customer", referencedColumnName = "id")
@ManyToOne
private Customer idCustomer;
public User() {
}
public User(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
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 Short getAuthLevel() {
return authLevel;
}
public void setAuthLevel(Short authLevel) {
this.authLevel = authLevel;
}
public String getIsActive() {
return isActive;
}
public void setIsActive(String isActive) {
this.isActive = isActive;
}
public Customer getIdCustomer() {
return idCustomer;
}
public void setIdCustomer(Customer idCustomer) {
this.idCustomer = idCustomer;
}
@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 User)) {
return false;
}
User other = (User) 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 "pl.kkp.entities.User[id=" + id + "]";
}
}
bean UserDAOBean.java
public boolean checkUser(String l, String p) {
List users = new LinkedList();
Query query = em.createNamedQuery("User.findByLoginAndPass");
query.setParameter("l", l);
query.setParameter("p", p);
users = query.getResultList();
if (users.isEmpty()) {
return false;
} else {
return true;
}
}
Następnie w warstwie webowej w klasie UserController.java implementuję tą metodę:
public String checkUsers(String l, String p) {
String r = "s";
boolean lol = userDao.checkUser(user.getLogin(), user.getPassword());
if (lol) {
r = "s";
} else {
r = "f";
}
return r;
}
W pliku index.jsp po podaniu przez użytkownika loginu i hasła powinno nastąpić wywołanie powyższej metody
<table class="log">
<tr><td>Login: </td><td>
<h:inputText value="#{userBean.user.login}" id="login" maxlength="20" size="15" />
</td></tr>
<tr><td>Hasło: </td><td>
<h:inputSecret value="#{userBean.user.password}" id="password" maxlength="20" size="15" />
</td></tr>
<tr><td></td><td>
<h:commandButton value="Zaloguj" id="zaloguj" action="#{userBean.checkUsers}" />
</td>
</tr>
</table>
Gdy uruchamiam serwer wpisuje login i hasło, naciskam przycisk zaloguj - pojawia mi się następująca strona
javax.el.PropertyNotFoundException: Target Unreachable, 'null' returned null
at com.sun.el.parser.AstValue.getTarget(AstValue.java:150)
at com.sun.el.parser.AstValue.getType(AstValue.java:76)
at com.sun.el.ValueExpressionImpl.getType(ValueExpressionImpl.java:195)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)
at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1008)
at javax.faces.component.UIInput.validate(UIInput.java:934)
...
Ma ktoś pomysł jak ten problem rozwiązać ?? Domyślam się, że bean kończy swój żywot z chwilą naciśnięcia przycisku zaloguj, nie wiem tylko jak ten problem rozwiązać.
Aha jeszcze plik faces-config.xml
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="1.2"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
<managed-bean>
<managed-bean-name>userBean</managed-bean-name>
<managed-bean-class>pl.kkp.controller.UserController</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/baza.jsp</from-view-id>
<navigation-case>
<from-outcome>create_new_user</from-outcome>
<to-view-id>/good.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/index.jsp</from-view-id>
<navigation-case>
<from-outcome>s</from-outcome>
<to-view-id>/good.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>f</from-outcome>
<to-view-id>/bad.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>