【问题标题】:Spring - How to use @RequestParam parameter of a Controller in a Custom Validator class?Spring - 如何在自定义验证器类中使用控制器的 @RequestParam 参数?
【发布时间】:2017-07-06 10:12:03
【问题描述】:

我在 Spring MVC 中使用 Hibernate 进行验证时遇到问题。

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

情况:这是我要在其中进行验证的控制器的负责人。我需要该 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
}

有什么想法吗?

【问题讨论】:

  • 我认为您应该从 Booking 中获取 id? booking.getId()
  • 在 requestParam 中我搜索车辆 ID,而不是预订 ID ;)
  • 您说“预订特定汽车”,那么为什么不将车辆的映射添加到您的 Booking 实体,然后您可以使用 getter 获取车辆 ID
  • vehicleID 应该是您的 Booking 对象的一部分,因为您想验证预订对吗?但是没有vehicleId,预订无效。
  • Booking 域类有一个车辆对象,但是当输入正确时,而不是在验证遇到错误时,将 vehicleId 分配给预订。如果我尝试从新预订中获取车辆 ID,则为空!

标签: spring hibernate validation spring-mvc customvalidator


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-17
    • 2011-07-13
    • 2022-07-21
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多