0

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>
Austin
  • 1,087
  • 3
  • 14
  • 27
  • where is the no-arg constructor ? a managed-bean MUST have a no-arg constructor – a.u.r Jul 20 '12 at 16:00
  • 1
    @a.u.r: I'm not sure if I understand your comment, but aren't you confusing the `enum` being the constructor? Anyway, Java will always implicitly provide a default public no-arg constructor if the class doesn't contain any constructors. If this constructor was really missing, the OP would have gotten a completely different exception. – BalusC Jul 20 '12 at 16:02
  • @BalusC , I was talking about the absent default constructor here; as it generated an error that took me long time to figure out.. I think you're right about the OP giving a different exception – a.u.r Jul 20 '12 at 16:08
  • @a.u.r: Go learn basic Java: http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html – BalusC Jul 20 '12 at 16:09

1 Answers1

8

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?

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
  • seems to have fixed firstname, lastname, but why do I need a setter for id and not first/lastname? id is set along with name after validation – Austin Jul 20 '12 at 16:17
  • You also need setters for them. I misread the code and assumed that you already have setters for them but that they were just misspelled. I updated the answer. – BalusC Jul 20 '12 at 16:20
  • so I wrote the setters/getters for all 3 properties and it worked with firstName lastName in the faces-config. Accepting this as the answer but not sure why I have to have setters for properties which will be set as a by-product of a separate operation, not the setter itself – Austin Jul 20 '12 at 16:33