Neither BindingResult nor plain target object for

2019-09-01 04:00发布

问题:

I'm a newbie with Spring Framework. I'm doing a tutorial about Spring 3 MVC and I get an exception when run web.

Exception :

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'contact1' available as request attribute
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:174)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:194)
org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:129)
org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:119)
org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:89)
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)
org.apache.jsp.contact_jsp._jspx_meth_form_005flabel_005f0(contact_jsp.java:222)
org.apache.jsp.contact_jsp._jspx_meth_form_005fform_005f0(contact_jsp.java:144)
org.apache.jsp.contact_jsp._jspService(contact_jsp.java:93)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

ContactController.java

@Controller
@RequestMapping("/contact.jsp")
public class ContactController {

@Autowired
private ContactService contactService;

@RequestMapping(method=RequestMethod.GET)
public String showForm(ModelMap model) {
    model.addAttribute("contact1", new Contact());
    //map.put("contactList", contactService.listContact());

    //return new ModelAndView("/contact","contact", new Contact());
    return "contact";

}

@RequestMapping(value = "/add", method = RequestMethod.POST)
public String addContact(@ModelAttribute("contact")
Contact contact, BindingResult result) {

    contactService.addContact(contact);

    return "redirect:/contact";
}

@RequestMapping("/delete/{contactId}")
public String deleteContact(@PathVariable("contactId")
Integer contactId) {

    contactService.removeContact(contactId);

    return "redirect:/index";
}
}

index.jsp

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
    <jsp:forward page="contact.jsp" ></jsp:forward>
</body>

contact.jsp

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
    <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <html>
    <head>
    <title>Spring 3 MVC Series - Contact Manager | viralpatel.net</title>
    </head>
    <body>

<h2>Contact Manager</h2>

<form:form action="/contact.jsp" method="POST" modelAttribute="contact1">

    <table>
        <tr>
            <td><form:label path="firstname">
                    <spring:message code="label.firstname" />
                </form:label></td>
            <td><form:input path="firstname" /></td>
        </tr>
        <tr>
            <td><form:label path="lastname">
                    <spring:message code="label.lastname" />
                </form:label></td>
            <td><form:input path="lastname" /></td>
        </tr>
        <tr>
            <td><form:label path="email">
                    <spring:message code="label.email" />
                </form:label></td>
            <td><form:input path="email" /></td>
        </tr>
        <tr>
            <td><form:label path="telephone">
                    <spring:message code="label.telephone" />
                </form:label></td>
            <td><form:input path="telephone" /></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit"
                value="<spring:message code="label.addcontact"/>" /></td>
        </tr>
    </table>
</form:form>


<h3>Contacts</h3>
<c:if test="${!empty contactList}">
    <table class="data">
        <tr>
            <th>Name</th>
            <th>Email</th>
            <th>Telephone</th>
            <th>&nbsp;</th>
        </tr>
        <c:forEach items="${contactList}" var="contact">
            <tr>
                <td>${contact.lastname}, ${contact.firstname}</td>
                <td>${contact.email}</td>
                <td>${contact.telephone}</td>
                <td><a href="delete/${contact.id}">delete</a></td>
            </tr>
        </c:forEach>
    </table>
</c:if>

springapp-servlet.xml

<?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
    http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<context:annotation-config />

<!-- Scan all java class -->
<context:component-scan base-package="*" />


<bean id="jspViewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/" />
    <property name="suffix" value=".jsp" />
</bean>

<bean id="simpleUrlMapping"
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/contact.jsp">contact</prop>
        </props>
    </property>
</bean>

<bean id="contact" name="contact" class="controller.ContactController" />

<!--    Declare DAO and Service refer to DAOImpl and ServiceImpl -->
<bean name="contactService" class="service.ContactServiceImpl"
    autowire="constructor" />
<bean name="contactDAO" class="dao.ContactDAOImpl" autowire="constructor" />


<bean id="messageSource"
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <property name="defaultEncoding" value="UTF-8" />
</bean>
<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="/WEB-INF/jdbc.properties" />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" />


<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<tx:annotation-driven />
<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

web.xml

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

<servlet>
    <servlet-name>springapp</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

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

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/springapp-servlet.xml</param-value>
</context-param>

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

Please help me fix this. I know the problem occurs because jsp page can't find modelAttribue but I don't know how to fix it.

Thanks

回答1:

Plz provide your web.xml entry, which actually maps Dispacher-servlet. I got what your prob is but depending upon that mapping i can suggest you the exact changes. I copied your code and make some changes now model is binded. Can you look into this plz.

your jsp

<form:form action="/web/contact.jsp/add" method="POST" commandName="contact1">

web.xml mapping is

<servlet>
    <servlet-name>springapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springapp</servlet-name>
    <url-pattern>/web/*</url-pattern>
</servlet-mapping>

i am calling this url to access form /web/contact.jsp. This will call GET method and provide blank form, with bind commandclass name="contact1".



回答2:

It means model which is passed from controller don't contain attribute named contact1. Add

model.addAttribute("contact1", new Contact());

to controller which returns this view.
Dispatcher servlet fetches each model attribute and passes them as request attribute to view. As you are missing contact1 in model so its giving error as

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

And check your controller mapping. Debug your application and check if controller is invoked and contact1 is successfully added to model.


EDIT:

You are using both commandName and modelAttribute which ultimately serves the same purpose. Remove commandName and only use moedlAttribute because ModelAttribute supersedes CommandAttribute.
Check link for more details http://chompingatbits.com/2009/08/25/spring-formtag-commandname-vs-modelattribute/



回答3:

Run you application in debugging mode. Check whether your controller calling method or not

public String showForm(ModelMap model) {}.

This problem occurs when your jsp file does not get modelAttribute="contact1" .