ModelAttribute对象字段在控制器中为null

时间:2017-05-19 11:47:45

标签: java spring jsp spring-mvc

当我提交表单时,modelAttribute保持为null。我查找了我的错误,但我被困在代码中的某处并请求您的帮助......请检查下面的代码

Spring version 4.2.0

<form:form class="form-horizontal" modelAttribute="book"
            action="${pageContext.request.contextPath}/book/add" method="post">
            <fieldset>
                <legend class="center-block">
                    New Book Information<span style="font-size: small"> * is a
                        required field</span>
                </legend>


                <!-- title -->
                <div class="form-group">
                    <label class="col-md-2 control-label" for="title">* Title</label>

                    <div class="col-md-8">
                        <form:input type="text" path="title" class="form-control" id="title"
                            required="required" placeholder="Title" />
                        <span class="help-block">Title of the book</span>
                    </div>
                </div>

                <!-- author -->
                <div class="form-group">
                    <label class="col-md-2 control-label" for="author">*
                        Author</label>
                    <div class="col-md-8">
                        <form:input type="text" path="author" class="form-control" id="author"
                            required="required" placeholder="Author" />
                        <span class="help-block">Author of the book</span>
                    </div>
                </div></form:form>

控制器: 得到:

@RequestMapping(value = "/add", method = RequestMethod.GET)
public String addBook(Model model) {
    Book book = new Book();
    model.addAttribute("book", book);
    return "addBook";
}

发表:

@RequestMapping(value = "/add", method = RequestMethod.POST)
public String addBookPost(@ModelAttribute("book") Book book, HttpServletRequest request) {
    System.out.println(book.getTitle());
    bookService.save(book);

    MultipartFile bookImage = book.getBookImage();
    System.out.println(book);
    try {
        byte[] bytes = bookImage.getBytes();
        String name = book.getId() + ".png";
        BufferedOutputStream stream = new BufferedOutputStream(
                new FileOutputStream(new File("src/main/resources/static/image/book/" + name)));
        stream.write(bytes);
        stream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return "redirect:bookList";
}

错误跟踪:

 java.lang.NullPointerException
com.adminportal.service.impl.BookServiceImpl.save(BookServiceImpl.java:18)
com.adminportal.controller.BookController.addBookPost(BookController.java:40)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:111)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:806)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:729)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

由于我没有从表单中获取任何数据,这就是为什么该对象无法保存在DB中。如何将表单数据绑定到控制器?我已经尝试了所有的解决方案,我现在无法弄清楚我错在哪里,我错过了什么。请帮助!

提前致谢

3 个答案:

答案 0 :(得分:1)

从控制器部分删除@ModelAttribute。确保jsp上的path属性与模型bean的属性匹配(即Book)。

@RequestMapping(value = "/add", method = RequestMethod.POST)
public String addBookPost(Book book, BindingResult result, ModelMap model) {

答案 1 :(得分:0)

你有 的显示java.lang.NullPointerException 在这条线上: 的 com.adminportal.service.impl.BookServiceImpl.save(BookServiceImpl.java:18) 也许你发空表?最好在属性和检查验证表单上使用BuildingResult验证 http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/validation/BindingResult.html 或者你有 com.adminportal.service.impl.BookServiceImpl = null

答案 2 :(得分:0)

确保确实在Book对象中定义了setter。因为提交JSP时,详细信息通过设置器被映射到Java Book对象中。