@Value 属性在 spring 组件中返回 null

jav*_*ser 1 java spring spring-mvc spring-annotations spring-boot

我在 Spring Boot 中创建了一个验证器组件,并在application.properties. 我已经使用@Value注释来获取组件中正则表达式的值,并且我正在任何方法或构造函数之外编译模式,这给了我空指针异常,因为正则表达式当时没有获取它的值。但是当我将模式转移到某种方法时,它工作得很好。这是为什么?为什么即使使用 @Component 创建对象,@Value 也不起作用

看下面的代码:

返回 NullPointerException 的代码:

@Component
public class ValidString implements ConstraintValidator<ValidString, String> {

  @Value("${user.input.regex}")
  private String USER_INPUT_REGEX;

  private Pattern USER_INPUT_PATTERN = Pattern.compile(USER_INPUT_REGEX);

  @Override
  public boolean validate(String userInput, ConstraintValidatorContext constraintValidatorContext) {
    return USER_INPUT_PATTERN.matcher(userInput).find();
  }
}
Run Code Online (Sandbox Code Playgroud)

代码工作正常:

@Component
public class ValidString implements ConstraintValidator<ValidString, String> {

  @Value("${user.input.regex}")
  private String USER_INPUT_REGEX;

  private Pattern USER_INPUT_PATTERN;

  @Override
  public boolean validate(String userInput, ConstraintValidatorContext constraintValidatorContext) {
    USER_INPUT_PATTERN = Pattern.compile(USER_INPUT_REGEX);
    return USER_INPUT_PATTERN.matcher(userInput).find();
  }
}
Run Code Online (Sandbox Code Playgroud)

另外,如果您能解释为什么第一个不起作用而第二个起作用,那就太好了。

应用程序属性

user.input.regex = ^[a-zA-Z0-9/\\-_ \\s+]*$
Run Code Online (Sandbox Code Playgroud)

And*_*eas 5

字段初始值设定项(相关的第一个示例)在类构造函数执行期间执行。在构造函数返回后由 Spring使用反射@Value注入。这意味着您不能使用使用注入值的初始值设定项。@Value

该问题可以通过构造函数或 setter 注入来解决:

// Inject using constructor
@Component
public class ValidString implements ConstraintValidator<ValidString, String> {

  private Pattern USER_INPUT_PATTERN;

  @Autowired
  public ValidString(@Value("${user.input.regex}") String regex) {
    this.USER_INPUT_PATTERN = Pattern.compile(regex);
  }
Run Code Online (Sandbox Code Playgroud)
// Inject using setter method
@Component
public class ValidString implements ConstraintValidator<ValidString, String> {

  private Pattern USER_INPUT_PATTERN;

  @Autowired
  private void setUserInputRegex(@Value("${user.input.regex}") String regex) {
    this.USER_INPUT_PATTERN = Pattern.compile(regex);
  }
Run Code Online (Sandbox Code Playgroud)