Lombok子类构造函数@Autowired
我有超级阶级:
@AllArgsConstructor
public abstract class AbstractSuperService {
protected final SuperRepository superRepository;
}
还有两个子类:
@Service
public class OneSubService extends AbstractSuperService {
private final OneRepository oneRepository;
public OneSubService(SuperRepository superRepository, OneRepository oneRepository){
super(superRepository);
this.oneRepository = oneRepository;
}
}
@Service
public class SecondSubService extends AbstractSuperService {
private final SecondRepository secondRepository;
public SecondSubService(SuperRepository superRepository, SecondRepository secondRepository){
super(superRepository);
this.secondRepository = secondRepository;
}
}
此代码是有效的。 但是,如果我更改代码:在子类中删除构造函数,并在所有类中添加注释Lombok @superbuilder。
@AllArgsConstructor
@SuperBuilder
public abstract class AbstractSuperService {
protected final SuperRepository superRepository;
}
@Service
@SuperBuilder
public class OneSubService extends AbstractSuperService {
private final OneRepository oneRepository;
}
@Service
@SuperBuilder
public class SecondSubService extends AbstractSuperService {
private final SecondRepository secondRepository;
}
出现以下错误:
Description:
Parameter 0 of constructor in OneSubService required a bean of type 'OneSubService$OneSubServiceBuilder' that could not be found.
Action:
Consider defining a bean of type 'OneSubService$OneSubServiceBuilder' in your configuration.
如何在子类中正确应用Lombok注释,以免在子类中编写构造函数?
I have superclass:
@AllArgsConstructor
public abstract class AbstractSuperService {
protected final SuperRepository superRepository;
}
And two subclass:
@Service
public class OneSubService extends AbstractSuperService {
private final OneRepository oneRepository;
public OneSubService(SuperRepository superRepository, OneRepository oneRepository){
super(superRepository);
this.oneRepository = oneRepository;
}
}
@Service
public class SecondSubService extends AbstractSuperService {
private final SecondRepository secondRepository;
public SecondSubService(SuperRepository superRepository, SecondRepository secondRepository){
super(superRepository);
this.secondRepository = secondRepository;
}
}
This code is work.
But if I change code: delete constructor in subclasses and add annotation lombok @SuperBuilder in all class.
@AllArgsConstructor
@SuperBuilder
public abstract class AbstractSuperService {
protected final SuperRepository superRepository;
}
@Service
@SuperBuilder
public class OneSubService extends AbstractSuperService {
private final OneRepository oneRepository;
}
@Service
@SuperBuilder
public class SecondSubService extends AbstractSuperService {
private final SecondRepository secondRepository;
}
The following error appears:
Description:
Parameter 0 of constructor in OneSubService required a bean of type 'OneSubService$OneSubServiceBuilder' that could not be found.
Action:
Consider defining a bean of type 'OneSubService$OneSubServiceBuilder' in your configuration.
How to correctly apply the lombok annotation in subclass, so as not to write constructor in subclass?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您使用
@superbuilder
,则不会创建构造函数。为了注入
OneRepository
和超级repository
,您需要一个将这两个对象作为参数的构造函数。使用
@allargconstructor
,Lombok仅为该类的成员创建构造函数,而不是考虑超级类。为什么?您可以阅读Lombok开发人员的答案在这里。。
最后,如果您想拥有超级类,则第一个解决方案是独特的解决方案。
If you use
@SuperBuilder
, no constructor is created.In Spring in order to inject
OneRepository
andSuperRepository
, you need a constructor having these two objects as parameters.Using
@AllArgConstructor
, Lombok creates the constructor just for the members of that class, not considering the super class.Why? You can read the answer of a Lombok developer here.
In the end, your first solution is a unique solution if you want to have a super class.