sách gpt4 ai đã đi

应用@valid之前的spring mvc进程对象

In lại 作者:行者123 更新时间:2023-12-01 23:23:27 29 4
mua khóa gpt4 Nike

我有一个如下所示的 spring mvc Controller

@RequestMapping(value="/new", method=RequestMethod.POST)
public String createBooking(@Valid Booking booking, BindingResult bindingResult, Model model, Principal principal)
{
if(bindingResult.hasErrors()) {
return "booking/edit";
}
//Store Booking in db...
...

问题是我从 POST 获取的 Booking 对象是由 Spring 构造的,但无法填充验证器所需的属性之一,因为该属性不存在于表单中。所以我的问题是,有没有办法让我在 @Valid 标记处理程序处理 Booking 之前拦截 Booking 以添加此必需属性?

干杯!网络功能虚拟化

1 Câu trả lời

hiện hữu@Valid触发之前,有两种方法可以修改模型属性对象:

  1. xóa bỏ @Valid 并 Autowiring 验证器并手动触发验证器:
class MyController {

private final Validator validator;

class MyController(Validator validator) {
this.validator = validator;
}

@PostMapping("/new")
public String createBooking(Booking booking, BindingResult bindingResult, Model model, Principal principal) {
// edit booking here

validator.validate(booking, result)

// original method body here
}
}

  • 装饰默认验证器并在装饰后的验证器内预处理 booking sự vật.
  • class MyController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
    binder.setValidator(new PreProcessBookingValidator(binder.getValidator()));
    }

    @PostMapping("/new")
    public String createBooking(@Valid Booking booking, BindingResult bindingResult, Model model, Principal principal) {
    ...
    }

    private static class PreProcessBookingValidator implements Validator {
    private final Validator validator;

    public PreProcessBookingValidator(Validator validator) {
    this.validator = validator;
    }

    @Ghi đè
    public boolean supports(@Nonnull Class clazz) {
    return validator.supports(clazz);
    }

    @Ghi đè
    public void validate(@Nonnull Object target, @Nonnull Errors errors) {
    if (target instanceof Booking) {
    Booking booking = (Booking) target;
    // manipulate booking here

    }

    validator.validate(target, errors);
    }
    }

    }

    (第二个技巧是我从 https://github.com/spring-projects/spring-framework/issues/11103 中学到的)

    关于应用@valid之前的spring mvc进程对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14732598/

    29 4 0
    行者123
    Hồ sơ cá nhân

    Tôi là một lập trình viên xuất sắc, rất giỏi!

    Nhận phiếu giảm giá Didi Taxi miễn phí
    Mã giảm giá Didi Taxi
    Giấy chứng nhận ICP Bắc Kinh số 000000
    Hợp tác quảng cáo: 1813099741@qq.com 6ren.com