Spring Boot继承RepresentationModelAssemblerSupport时Lombok@AllArgsConstructor冲突问题
解决Spring Boot中RepresentationModelAssemblerSupport与Lombok @AllArgsConstructor的冲突问题
问题原因
编译报错的核心原因是:@AllArgsConstructor生成的全参构造方法默认会隐式调用父类的无参构造,但父类RepresentationModelAssemblerSupport仅提供带参构造(需要传入controllerClass和resourceType),没有无参构造。你手动定义的无参构造虽然正确调用了父类构造,但Lombok生成的全参构造未做此操作,导致编译失败。
解决方案
方案1:手动编写全参构造(推荐)
去掉@AllArgsConstructor和@Autowired,手动编写包含依赖的构造方法,同时显式调用父类构造。Spring会自动通过构造注入依赖,无需额外注解:
@Component public class SaleModelAssembler extends RepresentationModelAssemblerSupport<Sale, SaleModel> { private final ModelMapper modelMapper; public SaleModelAssembler(ModelMapper modelMapper) { super(SaleResource.class, SaleModel.class); this.modelMapper = modelMapper; } @Override public SaleModel toModel(Sale sale) { SaleModel saleModel = createModelWithId(sale.getCode(), sale); modelMapper.map(sale, saleModel); saleModel.getItems().forEach(saleItemModel -> { saleItemModel.getProduct().add(linkTo(ProductResource.class) .slash(saleItemModel.getProduct().getId()).withSelfRel()); }); return saleModel; } @Override public CollectionModel<SaleModel> toCollectionModel(Iterable<? extends Sale> entities) { return super.toCollectionModel(entities).add(linkTo(SaleResource.class).withSelfRel()); } }
方案2:结合Lombok显式指定父类构造调用
若想保留Lombok注解,可手动编写全参构造并添加@AllArgsConstructor,确保构造方法调用父类的带参构造:
@Component public class SaleModelAssembler extends RepresentationModelAssemblerSupport<Sale, SaleModel> { private final ModelMapper modelMapper; // 保留无参构造(若业务需要) public SaleModelAssembler() { super(SaleResource.class, SaleModel.class); } @AllArgsConstructor public SaleModelAssembler(ModelMapper modelMapper) { super(SaleResource.class, SaleModel.class); this.modelMapper = modelMapper; } // 其他方法不变 }
内容的提问来源于stack exchange,提问作者Rafael Pierre
相关产品推荐
相关产品推荐

