Spring Boot-在创建时设置动态属性

时间:2018-11-14 10:31:06

标签: java spring hibernate

我有一个对象,该对象在其构造函数中具有一个属性,该属性是动态依赖于其所接收的另一个对象创建的。

    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"
}

谢谢

2 个答案:

答案 0 :(得分:0)

对此的答案是编写一个自定义的发布路由,在保存该对象之前可以在该对象上调用calculateEndTime()

答案 1 :(得分:0)

对此,比起编写自定义的postrout而言,更短的解决方案是使用@prePersist批注。

我的70odd行定制帖子被简化为@prePersist使用的if语句。