Spring - 如何在Custom Validator类中使用Controller的@RequestParam参数?

时间:2017-07-06 10:12:03

标签: spring hibernate validation spring-mvc customvalidator

我在使用Hibernate的Spring MVC中遇到了验证问题。

我想要一个有效用户输入的验证器,但验证必须在控制器外完成,因此,在一个单独的验证类中。

情况:这是我想要进行验证的控制器的负责人。我需要该ID来检索特定汽车的预订列表。

@PostMapping(value = "/rent")
    public ModelAndView vehicleRent(@ModelAttribute("newBooking") Booking booking, BindingResult bindingResult, @RequestParam("id") long id) {

但是如果我想将逻辑从这个控制器中分离出来创建一个自定义验证器,我有这个结果:

 public class BookingValidator implements Validator {

        @Autowired
        VehicleBO vehicleBo;

        @Override
        public boolean supports(Class<?> type) {
            return Booking.class.isAssignableFrom(type);
        }

        @Override
        public void validate(Object o, Errors errors) {

            Booking booking = (Booking) o;

        //other code

     rejectIfBookingExists(booking, 0, errors, "validation.booking.startdate.exists");
                }
            }

       public boolean rejectIfBookingExists(Booking booking, long id, Errors errors, String key){
        boolean exists = false;

         List<Booking> vehicleBookings = vehicleBo.getVehicleBookings(id);
        if (booking != null || booking.getStartDate() != null || booking.getFinishDate() != null) {
            for (Booking b : vehicleBookings) {
                if (booking.getStartDate().before((b.getFinishDate())) || booking.getStartDate().equals(b.getFinishDate())) {
                    errors.rejectValue("startDate", key);
                    exists = true;
                    break;
                }
            }
        }
        return exists;
    }
}

这样我无法检索列表,因为我没有所需的ID,你能解释一下如何做到这一点吗?或者,有其他方法可以解决这个问题?

谢谢!

编辑:

这是Booking类,因为你可以看到它有一个映射在

里面的Vehicle对象
@Entity
public class Booking implements Serializable {

    @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;


@ManyToOne
@JoinTable(name="user_booking", joinColumns={@JoinColumn(name ="booking_id", referencedColumnName ="id")},
                                inverseJoinColumns={@JoinColumn(name ="user_id", referencedColumnName ="id")})
private User user;

@ManyToOne
@JoinColumn(name = "vehicle_id")
private Vehicle vehicle;

@DateTimeFormat(pattern = "dd/MM/yyyy")
private Date startDate;

@DateTimeFormat(pattern = "dd/MM/yyyy")
private Date finishDate;

public Booking() {

//getter and setter and other code
}

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

为什么不在表单中将车辆ID映射为booking.vehicle.id?如果Vehicle有一个no-arg构造函数(它可能是一个实体),那么Booking应该返回POST请求处理程序中,并带有实例化的Vehicle,及其id属性集。然后,您应该可以通过验证器访问booking.vehicle.id

您可以在input[type=hidden]字段中使用booking.vehicle.id。在您对表单视图的GET请求中,只需将车辆ID注入@PathVariable并将其复制到您的模型中,以便您可以引用表单中的值。