spring mvc – Neither BindingResult nor plain target object for bean name available as request attribute

spring mvc – Neither BindingResult nor plain target object for bean name available as request attribute

In the controller, you need to add the login object as an attribute of the model:

model.addAttribute(login, new Login());

Like this:

@RequestMapping(value = /, method = RequestMethod.GET) 
public String displayLogin(Model model) { 
    model.addAttribute(login, new Login()); 
    return login; 
}

You would have got this Exception while doing a GET on http://localhost:8080/projectname/login

As Vinay has correctly stated you can definitely use

@RequestMapping(value = /login, method = RequestMethod.GET) 
public String displayLogin(Model model) { 
    model.addAttribute(login, new Login()); 
    return login; 
}

But I am going to provide some alternative syntax which I think you were trying with Spring 3.0.

You can also achieve the above functionality with

@RequestMapping(value = /login, method = RequestMethod.GET) 
public String displayLogin(Login loginModel) { 
    return login; 
}

and it login.jsp (assuming you are using InternalResourceViewResolver) you can have

<form:form method=POST action=login.htm modelAttribute=login>

Notice : modelAttribute is login and not loginModel. It is as per the class name you provide in argument. But if you want to use loginModel as modelAttribute is jsp you can do the following

@RequestMapping(value = /login, method = RequestMethod.GET) 
public String displayLogin(@ModelAttribute(loginModel)Login loginModel) { 
    return login; 
}

and jsp would have

<form:form method=POST action=login.htm modelAttribute=loginModel>

I know there are just different ways for doing the same thing. But the most important point to note here –

Imp Note: When you add your model class in your methods argument (like public String displayLogin(Login loginModel)) it is automatically created and added to your Model object (which is why you can directly access it in JSP without manually putting it in model). Then it will search your request if request has attributes that it can map with the new ModelObject create. If yes Spring will inject values from request parameters to your custom model object class (Login in this case).

You can test this by doing

@RequestMapping(value = /login, method = RequestMethod.GET) 
public String displayLogin(Login loginModel, Model model) { 
    System.out.println(model.asMap().get(login).equals(loginModel));
    return login; 
}

Note : Above creating of new custom model object may not hold true if you have given @SessionAttributes({login}). In this case it will get from session and populate values.

spring mvc – Neither BindingResult nor plain target object for bean name available as request attribute

the first time when you are returning your form make sure you pass the model attribute the form requires which can be done by adding the below code

@RequestMapping(value = /login, method = RequestMethod.GET)
public String login(Login login)
    return test;
}

By default the model attribute name is taken as Bean classs name with first lowercase letter

By doing this the form which expects a backing object naming login will be made available to it

after the form is submitted you can do the validation by passing your bean object and bindingresult as the method parameters as shown below

@RequestMapping(value = /login, method = RequestMethod.POST)
public String login(    @ModelAttribute(login) Login login,
                        BindingResult result) 

Leave a Reply

Your email address will not be published.