BeanResult'bookDto'的BindingResult和普通目标对象都不能用作请求属性

时间:2019-06-14 10:50:07

标签: java spring-boot thymeleaf

我正在使用Spring Boot和thymeleaf,并且在成功登录后返回索引页面时,我始终得到“ Bean名称bookDto的BindingResult和普通目标对象均不可用作请求属性”

奇怪的是,当我以localhost:8080/index搜索索引页时,索引页可以正常工作。

我还尝试过从登录方法返回另一个页面,并且只有它返回给我错误的索引页面。

下面是我的控制器方法和index.html表单

@RequestMapping(value = "/login")
@PostMapping
public ModelAndView login(@ModelAttribute("loginForm") LoginForm loginForm, ModelAndView modelAndView, BindingResult bindignResult) {   

    AppUser userLoggedIn = userService.findByUserNameAndEncryptedPassword(loginForm.getUsername(), loginForm.getPassword());

    if (userLoggedIn == null){
            modelAndView.addObject("errorLogin", "Incorrect Credentials!");
            modelAndView.setViewName("signin");

    }else {
             modelAndView.setViewName("index");
         }

     return modelAndView;
}

按图书属性过滤图书

 @RequestMapping(value = "/search")
 @PostMapping
 public ModelAndView searchBooks(@ModelAttribute ("bookDto") BookDto bookDto, Model model) {

    model.addAttribute("books", bookService.listAll(searchFilterBuilder.buildFilter(bookDto)));
    model.addAttribute("bookDto", bookDto);
    return new ModelAndView("index");

  } 

最后是我的index.html

   <form th:object="${bookDto}" th:action="@{/search}" method="post">

1 个答案:

答案 0 :(得分:0)

bookDto作为请求正文发送,因此您必须像这样获取它

public ModelAndView searchBooks(BookDto bookDto, Model model) {

只需删除@ModelAttribute

但是您必须确保bookDto得到初始化! 因此,当您导航到索引页面时,必须创建一个新的BookDto:

modelAndView.setViewName("index");
model.addAttribute("bookDto", new BookDto());