@Validate 不在页面上显示错误

时间:2021-06-16 16:25:43

标签: java spring spring-boot validation thymeleaf

@Valid 打印信息到控制台而不是页面

@Controller
public class RoomsController {

    private final HotelService hotelService;
    private final ComfortService comfortService;
    private final RoomService roomService;

    @Autowired
    public RoomsController(HotelService hotelService, ComfortService comfortService, RoomService roomService) {
        this.hotelService = hotelService;
        this.comfortService = comfortService;
        this.roomService = roomService;
    }

    @GetMapping("/admin/deleteRoom")
    String showDeleteRoomPage(@ModelAttribute("formData") DeleteRoomFormData formData){
        return "deleteRoom";
    }

    @PostMapping("/admin/deleteRoom")
    String doDeleteRoom(@Valid @ModelAttribute("formData")DeleteRoomFormData formData, Model model, BindingResult bindingResult){
        if (bindingResult.hasErrors()) {
            return "deleteRoom";
        }

        roomService.deleteRoomByNumberAndHotelName(formData.toParameters());

        return "redirect:/";
    }


}
public class DeleteRoomFormData {
    @NotNull
    @Range(min = 1, max = 300)
    private int number;

    @NotNull
    @Size(min = 4, max = 400, message = "Minimum number of characters = 4" )
    private String hotelName;

    public RoomDeleteParameters toParameters(){
        return new RoomDeleteParameters(number,hotelName);
    }
    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getHotelName() {
        return hotelName;
    }

    public void setHotelName(String hotelName) {
        this.hotelName = hotelName;
    }
}
package ua.forms;

import ua.models.Hotel;

public class RoomDeleteParameters {
    private final int number;

    private final String hotelName;

    public RoomDeleteParameters(int number, String hotelName) {
        this.number = number;
        this.hotelName = hotelName;
    }

    public int getNumber() {
        return number;
    }

    public String getHotelName() {
        return hotelName;
    }
}

      <div class="card-body">

                    <form class="form-horizontal" data-th-action="@{/admin/deleteRoom}" data-th-object="${formData}" method="post">

                        <div class="errors">
                            <div th:utext="${errorMessage}" data-th-if="${error}" class="alert alert-danger" role="alert">
                            </div>
                        </div>

                        <div class="form-group">
                            <label for="hotelName" class="cols-sm-2 control-label">Hotel Name</label>
                            <div class="cols-sm-10">
                                <div class="input-group">
                                    <span class="input-group-addon"><i class="fa fa-envelope fa" aria-hidden="true"></i></span>
                                    <input type="text" class="form-control" name="hotelName" id="hotelName" placeholder="Enter hotel name"  data-th-field="*{hotelName}"/>
                                </div>
                                <p style="color:red" th:if="${#fields.hasErrors('hotelName')}" th:text="${#strings.listJoin(#fields.errors('hotelName'), ', ')}"></p>
                            </div>
                        </div>

                        <div class="form-group">
                            <label for="number" class="cols-sm-2 control-label">Hotel Name</label>
                            <div class="cols-sm-10">
                                <div class="input-group">
                                    <span class="input-group-addon"><i class="fa fa-envelope fa" aria-hidden="true"></i></span>
                                    <input type="text" class="form-control" name="number" id="number" placeholder="Enter number"  data-th-field="*{number}"/>
                                </div>
                                <p style="color:red" th:if="${#fields.hasErrors('number')}" th:text="${#strings.listJoin(#fields.errors('number'), ', ')}"></p>
                            </div>
                        </div>

                        <div class="form-group ">
                            <input type="submit" value="Delete">
                        </div>
                    </form>
                </div>

当我的字段有错误时@Valid 将信息打印到控制台,但为什么不在页面上?

字段“hotelName”上的对象“formData”中的字段错误:拒绝值 [];代码 [Size.formData.hotelName,Size.hotelName,Size.java.lang.String,Size];参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [formData.hotelName,hotelName];参数 [];默认消息 [hotelName],400,4];默认消息 [最小字符数 = 4] 字段 'number' 上的对象 'formData' 中的字段错误:拒绝值 [0];代码 [Range.formData.number,Range.number,Range.int,Range];参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [formData.number,number];参数 [];默认消息 [编号],300,1];默认消息 [должно находиться в диапазоне от 1 до 300]]

1 个答案:

答案 0 :(得分:1)

BindingResult 参数需要跟在 @ModelAttribute 参数之后才能工作。因此,将您的 @PostMapping 更改为:

    @PostMapping("/admin/deleteRoom")
    String doDeleteRoom(@Valid @ModelAttribute("formData")DeleteRoomFormData formData, BindingResult bindingResult, Model model){
        if (bindingResult.hasErrors()) {
            return "deleteRoom";
        }

        roomService.deleteRoomByNumberAndHotelName(formData.toParameters());

        return "redirect:/";
    }