我有一个对象,该对象在其构造函数中具有一个属性,该属性是动态依赖于其所接收的另一个对象创建的。
public Booking(Customer customer, Barber barber, LocalDateTime startTime, Service service) {
this.customer = customer;
this.barber = barber;
this.startTime = startTime;
this.service = service;
this.endTime = null;
this.calculateEndTime();
}
public void calculateEndTime(){
int duration = this.service.getDuration();
this.setEndTime(this.startTime.plusMinutes(duration));
}
当我通过实现ApplicationRunner的数据加载器播种数据时,我的预订是使用endTime创建的。但是,当我因失眠发布新预订时,此calculateEndTime()
函数无法运行,我的endTime保持为null
。
据我了解,这是由于春天查看了默认的空构造函数和设置器来创建新对象。
所以我的问题是,为什么它可以通过数据加载器工作,如何通过前端/失眠发布新的预订来生成此信息?
我尝试在endTime设置器中调用此函数,但这不起作用。
通过数据加载器播种数据的示例:
@Component
public class DataLoader implements ApplicationRunner {
@Autowired
BarberRepository barberRepository;
@Autowired
CustomerRepository customerRepository;
@Autowired
BookingRepository bookingRepository;
@Autowired
ServiceRepository serviceRepository;
public DataLoader() {
}
public void run(ApplicationArguments args) {
Service beardTrim = new Service("Beard Trim", 5.00, 10);
serviceRepository.save(beardTrim);
Barber alan = new Barber("Alan");
barberRepository.save(alan);
Customer customer1 = new Customer("Joe");
customerRepository.save(customer1);
LocalDateTime startTime = LocalDateTime.of(2018, Month.NOVEMBER, 5, 12, 00);
Booking booking1 = new Booking(customer1, alan, startTime, beardTrim);
bookingRepository.save(booking1);
}
我要通过失眠发布的数据示例:
{
"startTime": "2018-11-12T09:00",
"barber": "http://localhost:8080/api/barbers/1",
"service": "http://localhost:8080/api/services/1",
"customer": "http://localhost:8080/api/customers/1"
}
谢谢
答案 0 :(得分:0)
对此的答案是编写一个自定义的发布路由,在保存该对象之前可以在该对象上调用calculateEndTime()
。
答案 1 :(得分:0)
对此,比起编写自定义的postrout而言,更短的解决方案是使用@prePersist批注。
我的70odd行定制帖子被简化为@prePersist使用的if语句。