我在Hibernate的Spring MVC中遇到了一個有關驗證的問題。春天 - 如何使用Custom Validator類中的Controller的@RequestParam參數?
我想要一個有效用戶輸入的驗證器,但驗證必須在控制器外完成,因此需要在單獨的驗證類中完成。
這種情況: 這是我想要做驗證的控制器的頭部。我需要該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;
}
}
這樣,我不能retreve名單,因爲我沒有所需的ID,你能解釋我該怎麼做?或者,還有其他方法可以解決這個問題?謝謝!
編輯:
這是艙位,你可以看到它裏面
@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.getId() – ACV
在requestParam我搜索的車輛ID,不是預定ID;) – TroubleM
你說「特定汽車的預定」那麼爲什麼你不加車輛的映射到您的預訂實體,那麼你可以得到帶有getter – Ranjeet