问题
I'm trying to create a simple login page that accesses a DB so that when username and password are validated, the id, firstName, lastName are set within the class as well for access. I get this error though:
javax.servlet.ServletException: Unable to create managed bean UserBean. The following problems were found:
- Property firstName for managed bean UserBean does not exist. Check that appropriate getter and/or setter methods exist.
- Property id for managed bean UserBean does not exist. Check that appropriate getter and/or setter methods exist.
- Property lastName for managed bean UserBean does not exist. Check that appropriate getter and/or setter methods exist.
javax.faces.webapp.FacesServlet.service(FacesServlet.java:321)
I have getters for id, firstName, lastName but no setters because they are set after validation.
Here is class UserBean
public class UserBean {
private static String password, username, id, firstName, lastName;
public enum DBfields { BLANK, USERNAME, ID, PASSWORD, FIRSTNAME, LASTNAME };
public String getPassword() {
return password;
}
public void setPassword( String value ) {
password = value;
}
public String getUsername() {
return username;
}
public void setUsername( String value ) {
username = value;
}
public static String getId() {
return id;
}
public static String getFirstname() {
return firstName;
}
public static String getLastname() {
return lastName;
}
public String loginUser() throws Exception {
if( loginValidate( username, password ) )
return "success";
else
return "fail";
}
public static boolean loginValidate( String username, String Password ) throws Exception{
String DBuser;
String DBpass = "asdf";
PreparedStatement table = connectToTable( "firstsql", "users");
ResultSet row = table.executeQuery();;
while(row.next()){
DBuser = row.getString(DBfields.USERNAME.name());
if(username.equals(DBuser)){
DBpass = row.getString(DBfields.PASSWORD.name());
break;
}
}
if(password.equals(DBpass)){
id = row.getString(DBfields.ID.name());
firstName = row.getString(DBfields.FIRSTNAME.name());
lastName = row.getString(DBfields.LASTNAME.name());
return true;
} else
return false;
}
and my faces-config
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<managed-bean>
<managed-bean-name>UserBean</managed-bean-name>
<managed-bean-class>com.jfsdemo.bean.UserBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>firstName</property-name>
<property-class>java.lang.String</property-class>
<value/>
</managed-property>
<managed-property>
<property-name>id</property-name>
<property-class>java.lang.String</property-class>
<value/>
</managed-property>
<managed-property>
<property-name>lastName</property-name>
<property-class>java.lang.String</property-class>
<value/>
</managed-property>
<managed-property>
<property-name>password</property-name>
<property-class>java.lang.String</property-class>
<value/>
</managed-property>
<managed-property>
<property-name>username</property-name>
<property-class>java.lang.String</property-class>
<value/>
</managed-property>
</managed-bean>
<navigation-rule>
<from-view-id>/login.xhtml</from-view-id>
<navigation-case>
<from-action>#{UserBean.loginUser}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/timesheet.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{UserBean.loginUser}</from-action>
<from-outcome>fail</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/timesheet.xhtml</from-view-id>
</navigation-rule>
</faces-config>
回答1:
Managed properties are set through the setters. So you really need to provide them. Also note that Java is case sensitive. Your first and last name properties are based on the getter names called firstname and lastname instead of firstName and lastName as expected by faces-config.xml. Fix it accordingly. Use getFirstName() and setFirstName() instead of getFirstname() and so on. Or, better, just have your IDE autogenerate the getters/setters based on properties.
By the way, why are those properties declared static? This way they will be shared across all users which are using the webapp. Is this really what you want?
来源:https://stackoverflow.com/questions/11582881/unable-to-create-managed-bean-userbean-jsf