SpringBoot更新数据库时出现NotReadablePropertyException异常求助
嘿,我来帮你搞定这个问题!你遇到的org.springframework.beans.NotReadablePropertyException异常,核心原因是Spring试图访问District类的stateId属性,但你的District实体里根本没定义这个字段——District中是通过private State state;这个关联对象来和State表建立关系的,而非直接存stateId字段。
咱们来看代码里的问题:
1. 最明显的错误:用错了Repository保存实体
看你StateCityDistrictImpl类里的updateDistrict方法,最后一行写的是:
return stateRepository.saveAndFlush(district);
这完全是搞混了!stateRepository是用来操作State实体的,你把District对象传给它,Spring Data JPA在处理时会按照State的属性规则去解析District的字段,自然找不到stateId(State有这个字段,但District没有),直接触发异常。
修复方法:把这行改成用districtRepository来保存:
return districtRepository.saveAndFlush(district);
2. 额外检查:是否有隐式的属性拷贝操作
如果上面的修复后还报错,那你要排查下有没有在其他地方用了BeanUtils.copyProperties这类工具,直接把DistrictBean的属性拷贝到District对象上。因为DistrictBean里有stateId字段,但District里只有state对象,没有对应的stateId属性,这种自动拷贝就会抛出这个异常。
如果是这种情况,就保持你现在手动处理关联关系的方式:
State state = new State(); state.setStateId(districtBean.getStateId()); district.setState(state);
别依赖自动拷贝工具处理关联对象。
小优化建议
另外,关于关联对象的设置,我建议你不要直接new一个只带id的State对象,最好先从数据库查询出真实的State记录,避免潜在的外键约束错误:
State state = stateRepository.findById(districtBean.getStateId()) .orElseThrow(() -> new StudawnException(ErrorCode.STATE_NOT_FOUND)); district.setState(state);
这样能确保你关联的State是真实存在于数据库中的,避免无效的外键值。
内容的提问来源于stack exchange,提问作者Muthukumaran K

