2017-07-06 19 views
0

我在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 
} 

任何想法映射車輛對象?

+0

我認爲你應該從預訂的身份證號碼? booking.getId() – ACV

+0

在requestParam我搜索的車輛ID,不是預定ID;) – TroubleM

+0

你說「特定汽車的預定」那麼爲什麼你不加車輛的映射到您的預訂實體,那麼你可以得到帶有getter – Ranjeet

回答

0

爲什麼不簡單地在您的表單中將車輛編號映射爲booking.vehicle.id?假設Vehicle有一個沒有參數的構造函數(它可能是一個實體),Booking應該返回POST請求處理程序,並帶有一個實例化的Vehicle及其id屬性集。然後,您應該能夠從驗證器訪問booking.vehicle.id

您可以使用input[type=hidden]booking.vehicle.id領域。在您的GET請求與形式來看,簡單地注入車輛ID作爲@PathVariable,並把它複製到你的模型,這樣你可以參考表格內的值。