我有Spring bean
@Component
public class CustomUriBuilder {
private final String cUrl;
private final String redirectUri;
private final String clientId;
public CustomUriBuilder (@Value("${project.url}") String cUrl,
@Value("${project.redirect.url}") String redirectUri, @Value("${project.client-id}") String clientId) {
this.cUrl= cUrl;
this.redirectUri = redirectUri;
this.clientId = clientId;
}
//No default constructor
}
我需要将这个bean注入另一个bean
@Component
public class LinksBuilder {
@Autowired
private final CustomUriBuilder customUriBuilder ;
//No constructors
}
但是我遇到了编译错误
错误:(21,34)java:变量customUriBuilder在未初始化 默认构造函数
与此同时,我正在将LinksBuilder
(最终)注入另一个控制器中而没有任何问题
@RestController
@RequestMapping(produces = "application/json")
public class resourceV4 {
private final LinksBuilder linksBuilder;
//No constructors
.
}
为什么在第一种情况下会给出错误,但在第二种情况下却能正常工作?
答案 0 :(得分:1)
从4.3版本开始,就有一个功能-您不能为最终的字段注入添加Autowired
注释
您必须对最终字段进行构造函数初始化。我看不到一个LinksBuilder和resourceV4。简称为龙目岛@RequiredArgsContructor
。
一个带有final字段的类不可能在没有构造函数的情况下正常编译,而另一个带有错误的类是不可能的。
运行其他编译器或构建方式(终端gradlew / maven等)为您澄清情况