2013-05-28 14 views
5

Z jakiegoś powodu nie mogę rozwiązać problemu, nawet po obejrzeniu wielu przykładów tutaj.Spring MVC Ani BindingResult ani zwykły obiekt docelowy dla nazwy komponentu bean

próbuję obsłużyć formularz za pomocą sprężyny 3 MVC, ale otrzymuję następujący błąd:

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

Więc ja niby się to, co jest problemem, ale nie udało mi się go rozwiązać. Oto metoda w moim

klasy ReverseController która rozciąga 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; 
} 

Moje app-servlet.xml definiuje kontroler następująco:

<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> 

Jest to forma, w moim odwrocie. 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> 

I to właśnie zostało zdefiniowane w moim 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> 

I wreszcie, to moja ReverseString obiektu:

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

}

+0

Czy pomieszałeś koncepcje Spring MVC 2.x i 3.x? - proszę napisać pełną klasę kontrolera. – Ralph

Odpowiedz

8

W pliku reverse.jsp dodano atrybut modelAttribute jako reverseString. Tak więc, przed załadowaniem pliku reverse.jsp, będzie szukać obiektu ReverseString.java.

Wystarczy dodać obiekt ReverseString.java w zakresie żądania metody kontrolera, skąd nawigować użytkownika do reverse.jsp.

np.

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

OK, więc teraz dodałem to. @RequestMapping (value = "/reverse.html" method = RequestMethod.GET) \t public String simpleForm (model model) { \t \t modelu.addAttribute (new ReverseString()); \t \t return "reverse"; \t} Zamiast funkcji modelAttribute po prostu mam commandName = "reverseString" w moim formularzu reverse.jsp. Nadal dostaję ten sam błąd. – mgerstner

0

Spróbuj dodać @ModelAttribute("reverseString") parametrów Twojego onSubmit metody.

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

Jak się dowiedziałem dla siebie ten wyjątek większość przypadków pojawia się, gdy ścieżka do kontrolera jest błędna. Lub błąd w składni. Tak bardzo dokładnie sprawdź, czy wszystkie linki w jsp i ścieżki są w porządku. Bo nawet "/" może być powodem wyjątku.

0

Dla mnie ten błąd został rozwiązany poprzez uznanie

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

w kontrolerze. Również w jsp odwołuję się do atrybutów modelu, odwołując się do nazwy klasy:

<form:input path="person.firstName" /> 
Powiązane problemy