我正在使用Spring Boot和thymeleaf,并且在成功登录后返回索引页面时,我始终收到“ BeanResult 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">

最佳答案

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

public ModelAndView searchBooks(BookDto bookDto, Model model) {


只需删除@ModelAttribute

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

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

10-06 08:13