【发布时间】: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