2014-02-14 29 views
4

我在網上看到了幾乎所有與這個問題有關的答案,但都找不到我的代碼中的問題。java.lang.IllegalStateException:BindingResult和bean名稱'category'的普通目標對象都不作爲請求屬性提供

這是我的JSP頁面。

<form:form method="POST" commandName="category" modelAttribute="category" action="search_category"> 
    <form:input path="category_name" /> 
    <input type="submit" value="Submit"> 
</form:form> 

當我刪除

<form:input path="category_name" /> 

它工作正常。我可以與我的控制器通信。所以這個問題與這條線有關。

@Controller 
public class SearchCategory { 

    @Autowired  
    private CategoryService categoryService; 

    @RequestMapping(value = "/search_category", method = RequestMethod.POST) 
    public @ResponseBody String searchCategoryFromDatabase(@ModelAttribute("category") Category category, BindingResult result){   

     return "something"; 
    } 
} 

這裏是我的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 

    <!-- Processes application requests --> 
    <servlet> 
     <servlet-name>appServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/servlet-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>appServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <!-- The definition of the Root Spring Container shared by all Servlets and Filters --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 

    <filter> 
     <filter-name>hibernateFilter</filter-name> 
     <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>hibernateFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping>  

    <listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

</web-app> 

這是我的servlet-context.xml的

<!-- Set the default page as index.jsp --> 
<mvc:view-controller path="/" view-name="index"/> 

<!-- Map resources --> 
<mvc:resources mapping="/resources/**" location="/, classpath:/META-INF/web-resources/" /> 

<!-- Map simple view name such as "test" into /WEB-INF/views/test.jsp --> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

而且我的applicationContext.xml

<!-- Enable @Controller annotation support --> 
    <mvc:annotation-driven /> 

    <context:annotation-config/>  

    <!-- Set the default page as index.jsp --> 
    <mvc:view-controller path="/" view-name="index"/> 

    <!-- Map resources --> 
    <mvc:resources mapping="/resources/**" location="/, classpath:/META-INF/web-resources/" /> 

    <!-- Map simple view name such as "test" into /WEB-INF/views/test.jsp --> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <!-- Scan classpath for annotations (eg: @Service, @Repository etc) --> 
    <context:component-scan base-package="com.XXXX"/> 

    <!-- JDBC Data Source. It is assumed you have MySQL running on localhost port 3306 with 
     username root and blank password. Change below if it's not the case --> 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <property name="url" value="jdbc:mysql://localhost:3306/XXXX"/> 
     <property name="username" value="XXXX"/> 
     <property name="password" value="XXXX"/> 
     <property name="validationQuery" value="SELECT 1"/> 
    </bean> 

    <!-- Hibernate Session Factory --> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="configLocation"> 
      <value>classpath:hibernate.cfg.xml</value> 
     </property> 
     <property name="packagesToScan"> 
      <array> 
       <value>com.XXXX</value> 
      </array> 
     </property> 
     <property name="hibernateProperties"> 
      <value> 
       hibernate.dialect=org.hibernate.dialect.MySQLDialect 
      </value> 
     </property>  
    </bean> 

    <!-- Hibernate Transaction Manager --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

    <!-- Activates annotation based transaction management --> 
    <tx:annotation-driven transaction-manager="transactionManager"/> 

我可能在我的XML文件中做錯了什麼。我是這個春天的新人 - Hibernate的員工等待你的幫助。謝謝..

這是越來越拋出

Stacktrace:] with root cause 
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'category' available as request attribute 
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141) 
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168) 
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188) 
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:154) 
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:141) 
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:132) 
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:116) 
    at org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:422) 
    at org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142) 
    at org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84) 
    at org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80) 
    at org.apache.jsp.index_jsp._jspx_meth_form_005finput_005f0(index_jsp.java:208) 
    at org.apache.jsp.index_jsp._jspx_meth_form_005fform_005f0(index_jsp.java:168) 
    at org.apache.jsp.index_jsp._jspService(index_jsp.java:100) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:149) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    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:722) 
+1

讓我們看到,呈現JSP處理程序。 –

+0

你可以嘗試返回「類別」;而不是在你的控制器方法中返回「某些東西」; – Susie

+0

@SotiriosDelimanolis對不起,我不明白你的意思。你能更專一些嗎?我對術語不太熟悉。 – likeachamp

回答

12

如果通過類似http://localhost:8080/yourapp前往index.jsp例外,我會認爲你有這方面的<welcome-file>

這意味着index.jsp會生成HTML,而不會由Spring進行任何預處理。您正在嘗試渲染此代碼

<form:form method="POST" commandName="category" modelAttribute="category" action="search_category"> 
    <form:input path="category_name" /> 
    <input type="submit" value="Submit"> 
</form:form> 

其中<form:form>來自Spring的標記庫。首先,請注意您正在使用commandNamemodelAttribute。這是多餘的。使用一個或另一個,而不是兩個。其次,當您指定其中之一時,標記實現將使用指定的名稱查找HttpServletRequest屬性。在你的情況下,沒有這樣的屬性被添加到HttpServletRequest屬性。這是因爲Servlet容器直接轉發給您的index.jsp

而不是這樣做,創建一個新的@Controller處理程序方法,該方法將向模型添加屬性並轉發到index.jsp視圖。

@RequestMapping(value = "/", method = RequestMethod.GET) 
public String welcomePage(Model model) { 
    model.addAttribute("category", new Category()); // the Category object is used as a template to generate the form 
    return "index"; 
} 

你可以擺脫這種

<!-- Set the default page as index.jsp --> 
<mvc:view-controller path="/" view-name="index"/> 

此外,從您的applicationContext.xml文件移到任何mvc配置您servlet-context.xml文件。這就是它所屬的地方。 Here's why.

+0

我添加控制器方法並從我的servlet xml文件中刪除mvc行。我仍然得到同樣的例外。你有什麼想法嗎? – likeachamp

+0

@ user3058742我有很多想法,但他們都需要你發佈你的所有配置和類。這並不理想。您應該嘗試瞭解您擁有的每個配置元素的功能。 「組件掃描」的目的是什麼? 「mvc:annotation-driven」的目的是什麼?什麼是@ @ RequestMapping?什麼是視圖,它是如何解決的?我們可以解決您的直接問題,但如果您不瞭解以前的概念,從長遠來看,這無濟於事。 –

+0

我其中大部分都是在其中工作。這就是爲什麼我很驚訝這是如何不起作用。看來我需要更深入地瞭解。謝謝您的幫助。 – likeachamp

0

當您的表單輸入標識未正確綁定時,通常會出現此錯誤,這意味着表單標記中使用的名稱/ id與bean不同。

0

這適用於我!

<form method="POST" action="employee.do"> 
    <table> 
     <tr> 
      <td>Name</td> 
      <td><input type="text" name="name" /></td> 
     </tr> 
     <tr> 
      <td>Age</td> 
      <td><input type="text" name="age" /></td> 
     </tr> 
     <tr> 
      <td colspan="2"> 
       <input type="submit" value="Add Employee"/> 
      </td> 
     </tr> 
    </table>  
</form> 

控制器

@RequestMapping(value = "/employee", method = RequestMethod.POST) 
    private ModelAndView addemployee(Employee emp, ModelAndView model, 
      @RequestParam String name, 
      @RequestParam String age) { 

     emp.setAge(age); 
     emp.setName(name); 
     employeeService.persistEmployee(emp); 

     return new ModelAndView("redirect:/employee.do"); 

    } 
相關問題