gpt4 book ai didi

java - Spring Boot Autowiring 配置仅在使用 Validator Bean 时为 Null

转载 作者:行者123 更新时间:2023-12-01 21:22:34 25 4
gpt4 key购买 nike

我有一个 Spring Boot 配置类,如下所示:

package foo.bar;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

@Configuration @ConfigurationProperties(prefix = "myConfig") public class MyConfig
{

private String foo;
private int myValue;

@NotNull private String requiredString;

@Min(0) @Max(100) private int smallPositiveInt;

public void setFoo(String foo) { this.foo = foo; }

public void setMyValue(int myValue) { this.myValue = myValue; }

public void setRequiredString(String requiredString) { this.requiredString = requiredString; }

public void setSmallPositiveInt(int smallPositiveInt)
{
this.smallPositiveInt = smallPositiveInt;
}

public String getRequiredString() { return requiredString; }

public int getSmallPositiveInt() { return smallPositiveInt; }

public String getFoo() { return foo; }

public int getMyValue() { return myValue; }
}

还有一个 YAML 配置文件,如下所示:

server:
port: 0

myConfig:
myValue: 9876543
foo: Goodbye
requiredString: Here
---

我的 SpringApplication 代码如下所示:

package foo.bar;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication public class MyService implements ApplicationRunner
{

// Define the logger object for this class
private final Logger log = LoggerFactory.getLogger(this.getClass());

@Autowired private MyConfig myConfig;

// myConfig is null when I uncomment these lines:
// @Bean
// public Validator configurationPropertiesValidator()
// {
// return new MyConfigValidator();
// }

@Autowired ApplicationContext applicationContext;

@Override public void run(ApplicationArguments applicationArguments) throws Exception
{
log.info("Running application...");

log.info("MyConfig values:");
log.info("foo=" + myConfig.getFoo());
log.info("myValue=" + myConfig.getMyValue());
log.info("smallPositiveInt=" + myConfig.getSmallPositiveInt());

log.warn("Example warning log message.");
log.error("Example error log message.");
log.debug("Example debug log message.");
}

public static void main(String[] args) { SpringApplication.run(MyService.class, args); }
}

当我取消注释 validator 时, Autowiring 配置为空,但注释掉后它工作正常。你知道依赖注入(inject)会发生什么吗?

MyConfigValidator 现在完全是空白的,只是实现了 Validator,没有实际功能,如果有人认为这可能是问题所在,我可以发布它。

更新:当我调试代码时,我可以看到 MyConfigValidator 中正在使用具有 YAML 文件中正确值的 MyConfig 对象调用 validate()。当该对象作为 Bean 包含在代码中时,Spring 是否有可能通过 Spring Boot 应用程序将该对象注入(inject)到 MyConfigValidator 中?

更新 2:看完Spring Boot property validation example我可以通过创建一个实现 ApplicationRunner 的静态类来使其工作。但是,我不明白为什么这是必要的,并且希望避免这样做。

最佳答案

我认为 myConfig 为 null 的原因是 configurationPropertiesValidator 提前实例化。这导致 MyServiceAutowiredAnnotationBeanPostProcessor 可用于注入(inject)字段之前被实例化。

如果将 configurationPropertiesValidator() 方法设置为静态,则一切应该正常工作:

@SpringBootApplication 
public class MyService implements ApplicationRunner {

// ...

@Bean
public static Validator configurationPropertiesValidator() {
return new MyConfigValidator();
}

// ...

}

关于java - Spring Boot Autowiring 配置仅在使用 Validator Bean 时为 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38899990/

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