mgrstnr
mgrstnr

Reputation: 520

Spring MVC Neither BindingResult nor plain target object for bean name

For some reason I cannot seem to fix this issue, even after looking at multiple examples on here.

I am trying to handle a form using Spring 3 MVC, but I am getting the following error:

 Neither BindingResult nor plain target object for bean name 'reverseString' available as request attribute

So I am kind of getting what is the problem here, but I failed to solve it. Here is the method in my

ReverseController class which extends SimpleFormController:

protected ModelAndView onSubmit(HttpServletRequest request,
        HttpServletResponse response, Object command, BindException errors)
        throws Exception {
    ReverseString revString = (ReverseString) command;
    ModelAndView mav = new ModelAndView();
    ModelMap map = new ModelMap();
    map.addAttribute("reverseString", revString);
    mav.addAllObjects(map);
    return mav;
}

My app-servlet.xml defines the controller as follows:

<bean name="/reverse.app" class="ReverseController">
    <property name="commandName" value="reverseString"></property>
    <property name="commandClass" value="ReverseString" />
    <property name="successView" value="reverseResult" />
    <property name="formView" value="reverse" />
</bean>

This is the form in my reverse.jsp:

<form:form method="POST" modelAttribute="reverseString" action="handleForm">
<form:errors path="*" cssClass="errorblock" element="div" />
    <table>
        <tr>
            <td>String to be reversed:</td>
            <td><form:input path="stringToReverse" />
            </td>
            <td><form:errors path="stringToReverse" cssClass="error" />
            </td>
        </tr>
        <tr>
            <td colspan="3"><input type="submit" /></td>
        </tr>
    </table>
</form:form>

And this is what is being defined in my web.xml:

 <web-app>
  <display-name>Spring Reverse String</display-name>      
  <welcome-file-list>
      <welcome-file>reverse.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
      <servlet-name>app</servlet-name>
      <servlet-class>Dispatcher</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>*.app</url-pattern>
  </servlet-mapping>
  <context-param>
    <param-name>contextConfigLocation</param-name>        
    <param-value>/WEB-INF/app-servlet.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>

And finally, this is my ReverseString object:

public class ReverseString {

public String stringToReverse;
public String reversedString;

public ReverseString(String rawString) {
    this.reversedString = reverseString(stringToReverse);
}

public String getStringToReverse() {
    return stringToReverse;
}

public void setStringToReverse(String stringToReverse) {
    this.stringToReverse = stringToReverse;
}

public String reverseString(String rawString) {
    if(rawString == null || rawString.length() <= 1) return rawString;
    return reverseString(rawString.substring(1)) + rawString.charAt(0);
}

}

Upvotes: 5

Views: 24127

Answers (4)

Shahriar
Shahriar

Reputation: 303

For me this error was resolved by declaring

@ModelAttribute("person")
public Person createFormModelAttribute() {
    return new Person();
}

in the controller. And also on the jsp, I refer to the model attributes by referencing the class name:

<form:input  path="person.firstName" />

Upvotes: 0

Devour
Devour

Reputation: 335

As I have found out for my self this exception most of cases appears when path to the controller is wrong. Or mistake in syntax. So very carefully check if all links in jsp and paths are right. Because even '/' can be reason of exception.

Upvotes: 1

Naresh J
Naresh J

Reputation: 2127

In your reverse.jsp file, you added modelAttribute as reverseString. So while before loading reverse.jsp, it will look for your ReverseString.java object.

You just need to add ReverseString.java object in request scope of your controller method from where you navigate user to reverse.jsp.

e.g.

@RequestMapping(value = "/getReverseStringForm")
  public String cmLogin(Model model) {
    model.addAttribute(new ReverseString());
    return "reverse";
  }

Upvotes: 8

Evgeni Dimitrov
Evgeni Dimitrov

Reputation: 22506

Try to add @ModelAttribute("reverseString") in your onSubmit method's parameters.

protected ModelAndView onSubmit(HttpServletRequest request,
        HttpServletResponse response, @ModelAttribute("reverseString") ReverseString revString, BindException errors)
        throws Exception

Upvotes: 0

Related Questions