Erika
Erika

Reputation: 145

Spring MVC NotReadablePropertyException in my User bean

I'm new to spring. I'm still trying to learn it because of a project. I would like to know what is the solution to this problem. I'm having a NotReadablePropertyException in my bean specifically the userName of the User bean.

This is my User Bean

package com.nutsaboutcandywebproject.model;

import static javax.persistence.GenerationType.IDENTITY;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name = "users", catalog = "db_nutsaboutcandy")
public class User {

    private int userId;
    private String username;
    private String firstname;
    private String lastname;
    private String password;
    private String role;
    private String address;

    public User(){

    }


    public User(int userId, String username, String firstname,
            String lastname, String password, String role, String address) {
        super();
        this.userId = userId;
        this.username = username;
        this.firstname = firstname;
        this.lastname = lastname;
        this.password = password;
        this.role = role;
        this.address = address;
    }
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "user_id", unique = true, nullable = false)
    public Integer getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }

    @Column(name = "username", nullable = false)
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

    @Column(name = "firstname", nullable = false)
    public String getFirstname() {
        return firstname;
    }
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    @Column(name = "lastname", nullable = false)
    public String getLastname() {
        return lastname;
    }
    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    @Column(name = "password", nullable = false)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        if(password.length()>=6){
            this.password = password;
        }
        else{
            throw new IllegalArgumentException("Password length must be more than 6 characters");
        }
    }

    @Column(name = "user_role", nullable = false)
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }

    @Column(name = "address", nullable = false)
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

This is my controller

@RequestMapping(value = "/login",method = RequestMethod.POST)
public ModelAndView login(@ModelAttribute("user")User user, BindingResult bindingResult, 
        HttpServletRequest request, HttpServletResponse response, 
        @RequestParam("usernametxt") String username, @RequestParam("passwordtxt") String password) 
{
    try 
    {
        // Using Spring ValidationUtils class to check for empty fields.
        // This will add the error if any in the bindingResult object.
        ValidationUtils.rejectIfEmptyOrWhitespace(bindingResult,"userName","userName", "Username can not be empty.");
        ValidationUtils.rejectIfEmptyOrWhitespace(bindingResult,"password","password", "Password not be empty");

        if (bindingResult.hasErrors())
        {
            //returning the errors on same page if any errors..
            return new ModelAndView("/LoginPage", "user", user);
        }
        else
        {
            // If the user details is validated then redirecting the user to success page, 
            // else returning the error message on login page.
            ServiceFacade facade = new ServiceFacadeImpl();
            List<User> userList = facade.getAllUsers();
            for(int index = 0; index < userList.size(); index++){
                String uname = userList.get(index).getUsername();
                String pword = userList.get(index).getPassword();
                if(username.equals(uname) && password.equals(pword))
                {
                    request.getSession().setAttribute("user", user);
                    //Creating a redirection view to success page. This will redirect to UsersController
                    RedirectView redirectView = new RedirectView("success.do", true);
                    return new ModelAndView(redirectView);
                }
                else
                {
                    bindingResult.addError(new ObjectError("Invalid", "Invalid credentials. " +
                            "Username or Password is incorrect."));
                    //return new ModelAndView("login", "user", user);
                }
            }

        }
    } catch (Exception e) {
        System.out.println("Exception in LoginController "+e.getMessage());
        e.printStackTrace();
        return new ModelAndView("/LoginPage", "user", user);
    }
    return null;
}

The stacktrace are as follows:

org.springframework.beans.NotReadablePropertyException: Invalid property 'userName' of bean class [com.nutsaboutcandywebproject.model.User]: Bean property 'userName' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:725)
    at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:716)
    at org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99)
    at org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:229)
    at org.springframework.validation.ValidationUtils.rejectIfEmptyOrWhitespace(ValidationUtils.java:245)
    at org.springframework.validation.ValidationUtils.rejectIfEmptyOrWhitespace(ValidationUtils.java:203)
    at com.nutsaboutcandywebproject.controller.UserController.login(UserController.java:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

Upvotes: 0

Views: 1640

Answers (1)

Sotirios Delimanolis
Sotirios Delimanolis

Reputation: 279970

It seems like you are submitting a form (or request parameters) with the value

userName=...

Spring uses bean naming conventions for resolving property setters. Your mutator and accessor are named

public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}

Note the lowercase n.

Change one or the other, but they need to match.

For your setter above to work, the name of the request parameter would have to be username.

Upvotes: 1

Related Questions