resu
resu

Reputation: 321

Bean property 'inputTitle' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

I am trying to add validation to a form using Spring MVC, and I keep getting an Http Status 500 error that I am baffled to find the root cause of. Every time I make a minor change in the hopes of fixing it, I get a different error, but they all end up being 500's and all seem to point to the jsp file (which at this point I don't think is the cause of the problem, but that's the error I am getting). If I remove the sf: tags from my form and inputs, the error goes away, but then so does the ability to validate the form.

here are (as far as I know) the relevant dependencies from my pom.xml (edited)

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.0.Final</version>
</dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

Here is the jsp file itself

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <title>Company Contacts</title>
        <link href="${pageContext.request.contextPath}/css/bootstrap.min.css" rel="stylesheet"> <!-- Bootstrap core CSS -->
        <link rel="shortcut icon" href="${pageContext.request.contextPath}/favicon-32x32.png"> <!-- SWC Icon -->
    </head>
    <body>
        <div class="container">
            <div class="form-horizontal">
            <h1>My DVDs</h1>
            </div>
            <hr/>
            <div class="form-horizontal">
                <h1>New DVD Form</h1>
                <a href="displayDvdCollection">Back to DVD Collection</a>
                <hr/>
                <sf:form class="form-horizontal" role="form" modelAttribute="dvd" action="addNewDvdToCollection" method="post">
                    <div class="form-group">
                        <label for="add-title" class="col-md-4 control-label">Title: </label>
                        <div class="col-md-8">
                            <sf:input type="text" cssClass="form-control" path="inputTitle" placeholder="Title" />
                            <sf:errors path="inputTitle" />
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="add-releaseDate" class="col-md-4 control-label">Release Date: </label>
                        <div class="col-md-8">
                            <sf:input type="date" cssClass="form-control" path="inputReleaseDate" placeholder="Release Date" />
                            <sf:errors path="inputReleaseDate" />
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="add-mpaaRating" class="col-md-4 control-label">MPAA Rating: </label>
                        <div class="col-md-8">
                            <sf:input type="text" cssClass="form-control" path="inputMpaaRating" placeholder="MPAA Rating" />
                            <sf:errors path="inputMpaaRating" />
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="add-director" class="col-md-4 control-label">Director: </label>
                        <div class="col-md-8">
                            <sf:input type="text" cssClass="form-control" path="inputDirector" placeholder="Director" />
                            <sf:errors path="inputDirector" />
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="add-studio" class="col-md-4 control-label">Studio: </label>
                        <div class="col-md-8">
                            <sf:input type="text" cssClass="form-control" path="inputStudio" placeholder="Studio" />
                            <sf:errors path="inputStudio" />
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="add-note" class="col-md-4 control-label">Note: </label>
                        <div class="col-md-8">
                            <input type="text" class="form-control" id="add-note" path="inputNote" placeholder="Note" />
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-md-offset-4 col-md-8">
                            <button type="submit" id="add-button" class="btn btn-default">Add New DVD</button>
                        </div>
                    </div>
                </sf:form>
            </div>
        </div>
        <!-- Placed at the end of the document so the pages load faster -->
        <script src="${pageContext.request.contextPath}/js/jquery-1.11.1.min.js"></script>
        <script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
    </body>
</html>

Here are the annotations from my model:

@NotEmpty(message="Title is required")
@Length(max=50, message="Title cannot exceed 50 characters")
private String title;

@DateTimeFormat(pattern="MM-dd-yyyy")
@NotNull(message="Release date is required")
private Date releaseDate;

@NotEmpty(message="Rating is required")
@Length(max=5, message="Rating options are G, PG, PG-13, R, NC-17")
private String mpaaRating;

@NotEmpty(message="Director is required")
@Length(max=50, message="Director's name cannot exceed 50 characters")
private String director;

@NotEmpty(message="Studio is required")
@Length(max=50, message="Studio's name cannot exceed 50 characters")
private String studio;

private String note;

Here are the related methods from my controller

@ModelAttribute("dvd")
public Dvd getDvdObject() {
    return new Dvd();
}

@RequestMapping("/addNewDvdToCollection")
public String validateAdd(Model model, Dvd thisDvd) {
    model.addAttribute("wigwam", thisDvd);
    return "newDvdForm";
}

@RequestMapping(value = "/addNewDvdToCollection", method = RequestMethod.POST)
//modelattr, dvd, bindingres, model
public String addNewDvdToCollection(Model model, @Valid @ModelAttribute("dvd") HttpServletRequest request, BindingResult result, Dvd thisDvd) {
    thisDvd = new Dvd();
    if (result.hasErrors()) {
        return validateAdd(model, thisDvd);
    }
    try {
        DateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
        thisDvd.setTitle(request.getParameter("inputTitle"));
        thisDvd.setReleaseDate(sdf.parse(request.getParameter("inputReleaseDate")));
        thisDvd.setMpaaRating(request.getParameter("inputMpaaRating"));
        thisDvd.setDirector(request.getParameter("inputDirector"));
        thisDvd.setStudio(request.getParameter("inputStudio"));
        thisDvd.setNote(request.getParameter("inputNote"));
    } catch (ParseException e) {
        e.getStackTrace();
    }
    dao.add(thisDvd);

    return "redirect:displayDvdCollection";
}

And finally here is the error output as of the last time I tried to access the addDvdForm.jsp via button click

org.apache.jasper.JasperException: An exception occurred processing JSP page /jsp/newDvdForm.jsp at line 27

24:                     <div class="form-group">
25:                         <label for="add-title" class="col-md-4 control-label">Title: </label>
26:                         <div class="col-md-8">
27:                             <sf:input type="text" cssClass="form-control" path="inputTitle" placeholder="Title" />
28:                             <sf:errors path="inputTitle" />
29:                         </div>
30:                     </div>


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:574)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1217)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

org.springframework.beans.NotReadablePropertyException: Invalid property 'inputTitle' of bean class [com.swcguild.dvdlibrarymvc.model.Dvd]: Bean property 'inputTitle' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:725)
    org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:716)
    org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99)
    org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:229)
    org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:154)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:141)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:132)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:116)
    org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:422)
    org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142)
    org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84)
    org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80)
    org.apache.jsp.jsp.newDvdForm_jsp._jspx_meth_sf_005finput_005f0(newDvdForm_jsp.java:386)
    org.apache.jsp.jsp.newDvdForm_jsp._jspService(newDvdForm_jsp.java:158)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1217)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Thank you in advance for taking the time to look over this for me.

Upvotes: 1

Views: 2027

Answers (1)

resu
resu

Reputation: 321

BalusC was right, the names in the Model need to match the paths names in the JSP.

Upvotes: 2

Related Questions