POST请求时JPA仍调用实体类默认构造函数致属性初始化异常
问题根源
POST请求创建Flight时,是JSON序列化框架(比如Jackson)调用默认构造函数实例化对象,再通过setter方法注入请求体中的属性。你的availableSeats初始化逻辑只存在于带参数的构造函数中,默认构造函数创建对象时,int类型的availableSeats会被Java默认初始化为0,而请求体中如果没有传递该字段,它就会保持0值,不会触发带参数构造函数里的初始化逻辑。
解决方案
以下几种方法都能解决这个问题,选适合你的即可:
方法1:字段声明时直接初始化
在availableSeats字段定义时直接赋值,这样不管通过哪个构造函数创建对象,该字段都会被初始化为100:
private static final int INITIAL_SEAT_CAPACITY = 100; private int availableSeats = INITIAL_SEAT_CAPACITY; // 直接初始化
方法2:在默认构造函数中添加初始化逻辑
修改默认构造函数,加入availableSeats的初始化代码:
public Flight(){ this.availableSeats = INITIAL_SEAT_CAPACITY; }
同时你的带参数构造函数里,availableSeats参数是多余的(因为你直接赋值为INITIAL_SEAT_CAPACITY),建议移除这个参数避免误解:
// 移除多余的availableSeats参数 public Flight(Long id, String airlineName, String fromLocation, String toLocation, String gateNumber, ZonedDateTime dateTimeZone) { this.id = id; this.airlineName = airlineName; this.fromLocation = fromLocation; this.toLocation = toLocation; this.gateNumber = gateNumber; this.dateTimeZone = dateTimeZone; this.availableSeats = INITIAL_SEAT_CAPACITY; }
方法3:使用@PostConstruct注解(备选)
在实体类中添加初始化方法,用@PostConstruct标记,JPA和JSON框架实例化对象后会执行该方法:
@PostConstruct private void init() { this.availableSeats = INITIAL_SEAT_CAPACITY; }
如果需要保留请求体中传递的availableSeats值,可调整为仅当未设置时初始化:
@PostConstruct private void init() { if (this.availableSeats == 0) { this.availableSeats = INITIAL_SEAT_CAPACITY; } }
内容的提问来源于stack exchange,提问作者Anant
相关产品推荐
相关产品推荐

