gpt4 book ai didi

java - Spring 中可选字段的 Autowiring

转载 作者:行者123 更新时间:2023-11-30 01:46:22 24 4
gpt4 key购买 nike

如果这个问题之前已经被回答过或者它太简单了,我事先表示歉意,但我对 spring 作为 DI 框架相对较新,并且遇到以下问题

@Bean
public EnvironmentInfo environmentInfo() {
return new EnvironmentInfo();
}

@Bean(name = "availabilityZone")
@Autowired
public Optional<String> getAvailabilityZone(EnvironmentInfo envInfo) {
return envInfo.getAvailabilityZone(); // this returns an Optional<String>
}

然后我在其他地方像这样 Autowiring 它

@Autowired
@Named("availabilityZone")
protected Optional<String> availabilityZone;

现在,我在 getAvailabilityZone 中放置了一条日志语句,并确认其被调用,并且它的计算结果为具有适当可用性区域的可选值。然而, Autowiring 本身的计算结果为Optional.empty

我的问题是, Autowiring 中是否缺少一些东西来正确出售可选?

编辑

如果我这样做,问题就会有效地消失

@Bean(name = "availabilityZone")
@Autowired
public String getAvailabilityZone(EnvironmentInfo envInfo) {
return envInfo.getAvailabilityZone().getOrElse("N/A");
}

@Autowired
@Named("availabilityZone")
protected String availabilityZone;

最佳答案

Autowiring 可选值还有另一个含义,这就是它不能按您希望的方式工作的原因。

我在以下情况下使用了它。不保证 JavaMailSender 可用,但如果可用,则可以作为 JavaMailSender 注入(inject)使用,而不是:

@Autowired
protected Optional<JavaMailSender> mailSender;

最糟糕的答案是以下工作(至少在最近的 spring-boot 中):

@Service
public class TestController {
@Autowired
TestController(@Named("availabilityZone") Optional<Optional<String>> availabilityZone) {
System.out.println(availabilityZone);
}
}

但这让我哭了......

另一个更好一点的选择是:

@Bean(name = "availabilityZone")
@Autowired
public String getAvailabilityZone(EnvironmentInfo envInfo) {
return envInfo.getAvailabilityZone().orElse(null);
}

另一个解决方案是将其包装在一些自定义对象中,但我认为为您的 bean 返回 null 就足够了。

关于java - Spring 中可选字段的 Autowiring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57794905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com