Java 正在尝试使用thymeleaf进行Spring引导表单验证,但得到一个错误,我可以';不明白

Java 正在尝试使用thymeleaf进行Spring引导表单验证,但得到一个错误,我可以';不明白,java,spring-boot,thymeleaf,Java,Spring Boot,Thymeleaf,编辑:页面现在完全按照预期工作,我已经更新了下面的代码以反映我的更改。问题是我需要在网页的GetMapping中向模型添加Booking属性。我还需要更正网页上的表单标签。 我有一个演示web应用程序,我正试图在表单上添加错误检查,并在相关输入下显示错误消息。然而,在实现了我发现的一个方法之后,当我尝试使用我试图实现验证的表单导航到web页面时,会出现一个白标签错误页面。它说“是由以下原因引起的:java.lang.IllegalStateException:bean名称“Booking”的Bi

编辑:页面现在完全按照预期工作,我已经更新了下面的代码以反映我的更改。问题是我需要在网页的GetMapping中向模型添加Booking属性。我还需要更正网页上的表单标签。

我有一个演示web应用程序,我正试图在表单上添加错误检查,并在相关输入下显示错误消息。然而,在实现了我发现的一个方法之后,当我尝试使用我试图实现验证的表单导航到web页面时,会出现一个白标签错误页面。它说
“是由以下原因引起的:java.lang.IllegalStateException:bean名称“Booking”的BindingResult和普通目标对象都不能作为请求属性使用”

以下是有问题的网页:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Reserve Booking</title>
</head>
<body>
    <h1>Reserve Booking</h1>
    <form th:object="${Booking}">
        <label for="flightId">Flight ID</label>
        <input name="flightId" type="text" th:field="*{flightId}"/>
        <label th:if="${#fields.hasErrors('flightId')}" th:errors="*{flightId}">Flight ID Error</label>
        </br>
        <label for="seatNum">Seat Number</label>
        <input name="seatNum" type="text" th:field="*{seatNum}"/>
        <label th:if="${#fields.hasErrors('seatNum')}" th:errors="*{seatNum}">Seat Number Error</label>
        </br>
        <input type="submit" formmethod="post" value="Submit"/>
        </br>
        <button formaction="/index.html">Back to Index</button>
    </form >
</body>
</html>
以下是控制器的相关代码:

@Controller
@RequestMapping(value = "/booking")
public class BookingController{
    @Autowired
    BookingData bookingData;

    @GetMapping(value = "/reserve")
    public String ReserveHandler(Model model){
        if(!model.containsAttribute("Booking")){
            model.addAttribute("Booking", new Booking());
        }
        return "booking/reserve";
    }

    @PostMapping(value = "/reserve")
    public String ReserveSeat(
        @Valid @ModelAttribute("Booking") Booking booking, 
        BindingResult bindingResult, 
        Model model
    ){
        String redirect;

        if(bindingResult.hasErrors()){
            redirect = "booking/reserve";
        }else{
            model.addAttribute("bookingList", bookingData.getAllBookings());
            bookingData.addNewBooking(booking);
            redirect = "booking/show";
        }

        return redirect;
    }
}

在尝试在表单上实现错误检查之前,一切都很好。错误检查与BookingData无关,因此我没有将其包括在内。它只是一个预定座位的数组列表和返回列表以及添加和删除列表的方法

您没有在控制器中添加模型,以匹配表单中的
th:Object
。在
ReserveHandler
中,需要添加model属性。我不确定最近情况发生了什么变化(如果有的话),但我以前做过(在本例中使用了一些模型名称):

公共字符串myGetRequest(模型){
如果(!model.containsAttribute(“预订”)){
//在此处添加命名模型属性
model.addAttribute(“预订”,新预订());
}
返回“预订/预订”;
}
@后映射(…)
公共字符串myPostRequest(
@有效@modeldattribute预订,
最终绑定结果绑定结果,
最终重定向属性重定向属性
) {
if(bindingResult.hasErrors()){
//添加验证错误
redirectAttributes.addFlashAttribute(“org.springframework.validation.BindingResult.Booking”,BindingResult);
//设置模型属性
重定向属性。addFlashAttribute(“预订”,预订);
返回“重定向:/booking/reserve”;
}
//否则。。。
返回“重定向:/booking/show”;
}

您没有在控制器中添加模型,以匹配表单中的
th:Object
。在
ReserveHandler
中,需要添加model属性。我不确定最近情况发生了什么变化(如果有的话),但我以前做过(在本例中使用了一些模型名称):

公共字符串myGetRequest(模型){
如果(!model.containsAttribute(“预订”)){
//在此处添加命名模型属性
model.addAttribute(“预订”,新预订());
}
返回“预订/预订”;
}
@后映射(…)
公共字符串myPostRequest(
@有效@modeldattribute预订,
最终绑定结果绑定结果,
最终重定向属性重定向属性
) {
if(bindingResult.hasErrors()){
//添加验证错误
redirectAttributes.addFlashAttribute(“org.springframework.validation.BindingResult.Booking”,BindingResult);
//设置模型属性
重定向属性。addFlashAttribute(“预订”,预订);
返回“重定向:/booking/reserve”;
}
//否则。。。
返回“重定向:/booking/show”;
}

将模型属性添加到GetMapping中确实解决了白标签错误页面,因此感谢您。但是,现在我没有在输入无效的页面上看到错误,即使输入有效,也不会重定向到booking/show。我已尝试调整PostMapping以与您的匹配,但没有任何改进。@Tom我已更新我的答案,将验证错误包括在
addFlashAttribute
中,并将
return“重定向:/booking/show”中。我想这应该会解决的。我发现问题出在表单标签上。我纠正了它,一切都按计划进行。再次感谢你的帮助。我已经更新了问题中的代码,以反映所做的更改。将模型属性添加到GetMapping中确实解决了白标签错误页面,因此感谢您。但是,现在我没有在输入无效的页面上看到错误,即使输入有效,也不会重定向到booking/show。我已尝试调整PostMapping以与您的匹配,但没有任何改进。@Tom我已更新我的答案,将验证错误包括在
addFlashAttribute
中,并将
return“重定向:/booking/show”中。我想这应该会解决的。我发现问题出在表单标签上。我纠正了它,一切都按计划进行。再次感谢你的帮助。我已经更新了问题中的代码,以反映所做的更改。
@Controller
@RequestMapping(value = "/booking")
public class BookingController{
    @Autowired
    BookingData bookingData;

    @GetMapping(value = "/reserve")
    public String ReserveHandler(Model model){
        if(!model.containsAttribute("Booking")){
            model.addAttribute("Booking", new Booking());
        }
        return "booking/reserve";
    }

    @PostMapping(value = "/reserve")
    public String ReserveSeat(
        @Valid @ModelAttribute("Booking") Booking booking, 
        BindingResult bindingResult, 
        Model model
    ){
        String redirect;

        if(bindingResult.hasErrors()){
            redirect = "booking/reserve";
        }else{
            model.addAttribute("bookingList", bookingData.getAllBookings());
            bookingData.addNewBooking(booking);
            redirect = "booking/show";
        }

        return redirect;
    }
}