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)
字段初始值设定项(相关的第一个示例)在类构造函数执行期间执行。在构造函数返回后由 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)
| 归档时间: |
|
| 查看次数: |
2643 次 |
| 最近记录: |