异常作为默认值 Spring @Value()
Exception as default value of Spring @Value()
我是 Java/Spring 的新手。我需要从配置中读取一些值,但如果它不存在,它应该会失败。现在我有以下代码:
public class SomeClass {
@Value("${some.property:#{null}}")
private String someProperty;
public void someMethod() throws Exception {
if (someProperty == null) throw new AopConfigException("The property must be set");
}
}
它工作正常,但我需要添加额外的 if
块。我可以这样写吗?
@Value("${some.property:#{throw new AopConfigException(\"The property must be set\")}}")
private String someProperty;
或
@Value("${some.property:#{throwException()}}")
private String someProperty;
private static void throwException() {
throw new AopConfigException("The property must be set");
}
立即失败
更新:
如果我不按照下面的建议使用一些默认值,那么它对我来说仍然不会失败。我没有 java.lang.IllegalArgumentException
:
只需在 post 构造中验证以保证它 运行 一旦创建 bean:
@PostConstruct
private static void throwException() {
if (someProperty == null) {
throw new AopConfigException("The property must be set");
}
}
默认情况下需要@Value。所以,只需使用
@Value("${some.property}")
而不是
@Value("${some.property:#{null}}")
因此,如果 属性 不存在,您的应用程序将无法启动,并出现如下异常:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'invalid.value' in value "${invalid.value}"
更新:如果你想有一个密钥并且可以像这样为空:
some.property=
如果 属性 为空,你想抛出异常,然后使用 @PostConstruct
如下:
@PostConstruct
public void validateValue() {
if (someProperty.isEmpty()) {
throw new MyNiceException("error");
}
}
更多更新: 如果您想要初始化 null 以防没有注册表项 as
@Value("${some.property:#{null}}")
private String someProperty;
然后这样做:
@PostConstruct
public void validateValue() {
if (someProperty == null) {
throw new IllegalArgumentException("error");
}
}
请不要给你的属性赞一个默认值
@Value("${some.property}")
And in case the property is not set spring will through an exception and you are done right.
恐怕您不能只使用 @Value
注释来做到这一点。但是,您可以通过使用 spring 环境读取值来检查是否设置了某个 属性。如果未设置值,这将抛出 IllegalStateException
。
因此,例如,如果您有环境变量,例如:
@Autowired
private ConfigurableEnvironment env;
然后你可以通过调用getRequiredProperty
:
方法来初始化这个值
<T> T getRequiredProperty(java.lang.String key, java.lang.Class<T> targetType)
throws java.lang.IllegalStateException
因此对于您的用例,您将像这样初始化您的 bean:
@Bean
public SomeClass someClass () {
String someProperty = env.getRequiredProperty ("some.property");
return new SomeClass (someProperty);
}
为了使 属性 替换正常工作,您需要像这样 (example taken from here):
添加一个 PropertySourcesPlaceholderConfigurer
bean 到您的配置中
@Bean
public static PropertySourcesPlaceholderConfigurer properties(){
final PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
// add your property files below
final Resource[] resources = new ClassPathResource[]{new ClassPathResource("foo.properties")};
pspc.setLocations( resources );
// this will make the replacement fail, if property is not known
pspc.setIgnoreUnresolvablePlaceholders(false);
return pspc;
}
如果您已经使用 @PropertySource
注释配置 属性 源,您应该能够省略手动将资源添加到 PropertySourcesPlaceholderConfigurer
,因为它应该从 [=24] 中获取值=] 环境自动.
一旦这个 bean 就位,只需使用
@Value("${data.import.path}")
如果没有默认设置(如其他答案中所述),您的应用程序初始化将在很早的阶段失败。
我是 Java/Spring 的新手。我需要从配置中读取一些值,但如果它不存在,它应该会失败。现在我有以下代码:
public class SomeClass {
@Value("${some.property:#{null}}")
private String someProperty;
public void someMethod() throws Exception {
if (someProperty == null) throw new AopConfigException("The property must be set");
}
}
它工作正常,但我需要添加额外的 if
块。我可以这样写吗?
@Value("${some.property:#{throw new AopConfigException(\"The property must be set\")}}")
private String someProperty;
或
@Value("${some.property:#{throwException()}}")
private String someProperty;
private static void throwException() {
throw new AopConfigException("The property must be set");
}
立即失败
更新:
如果我不按照下面的建议使用一些默认值,那么它对我来说仍然不会失败。我没有 java.lang.IllegalArgumentException
:
只需在 post 构造中验证以保证它 运行 一旦创建 bean:
@PostConstruct
private static void throwException() {
if (someProperty == null) {
throw new AopConfigException("The property must be set");
}
}
默认情况下需要@Value。所以,只需使用
@Value("${some.property}")
而不是
@Value("${some.property:#{null}}")
因此,如果 属性 不存在,您的应用程序将无法启动,并出现如下异常:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'invalid.value' in value "${invalid.value}"
更新:如果你想有一个密钥并且可以像这样为空:
some.property=
如果 属性 为空,你想抛出异常,然后使用 @PostConstruct
如下:
@PostConstruct
public void validateValue() {
if (someProperty.isEmpty()) {
throw new MyNiceException("error");
}
}
更多更新: 如果您想要初始化 null 以防没有注册表项 as
@Value("${some.property:#{null}}")
private String someProperty;
然后这样做:
@PostConstruct
public void validateValue() {
if (someProperty == null) {
throw new IllegalArgumentException("error");
}
}
请不要给你的属性赞一个默认值
@Value("${some.property}")
And in case the property is not set spring will through an exception and you are done right.
恐怕您不能只使用 @Value
注释来做到这一点。但是,您可以通过使用 spring 环境读取值来检查是否设置了某个 属性。如果未设置值,这将抛出 IllegalStateException
。
因此,例如,如果您有环境变量,例如:
@Autowired
private ConfigurableEnvironment env;
然后你可以通过调用getRequiredProperty
:
<T> T getRequiredProperty(java.lang.String key, java.lang.Class<T> targetType)
throws java.lang.IllegalStateException
因此对于您的用例,您将像这样初始化您的 bean:
@Bean
public SomeClass someClass () {
String someProperty = env.getRequiredProperty ("some.property");
return new SomeClass (someProperty);
}
为了使 属性 替换正常工作,您需要像这样 (example taken from here):
添加一个PropertySourcesPlaceholderConfigurer
bean 到您的配置中
@Bean
public static PropertySourcesPlaceholderConfigurer properties(){
final PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
// add your property files below
final Resource[] resources = new ClassPathResource[]{new ClassPathResource("foo.properties")};
pspc.setLocations( resources );
// this will make the replacement fail, if property is not known
pspc.setIgnoreUnresolvablePlaceholders(false);
return pspc;
}
如果您已经使用 @PropertySource
注释配置 属性 源,您应该能够省略手动将资源添加到 PropertySourcesPlaceholderConfigurer
,因为它应该从 [=24] 中获取值=] 环境自动.
一旦这个 bean 就位,只需使用
@Value("${data.import.path}")
如果没有默认设置(如其他答案中所述),您的应用程序初始化将在很早的阶段失败。