Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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);
}

}

like image 985
mgrstnr Avatar asked May 28 '13 09:05

mgrstnr


2 Answers

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";
  }
like image 80
Naresh J Avatar answered Oct 15 '22 01:10

Naresh J


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.

like image 26
Devour Avatar answered Oct 15 '22 01:10

Devour