我正在使用 Java EE 6,需要从“.properties”文件加载配置。有没有推荐的方式(最佳实践)使用依赖注入(inject)从配置文件中加载值?我在 Spring 中找到了这个注解,但我还没有找到 Java EE 的“标准”注解。
这家伙从头开发了一个解决方案:
"I couldn't find a simple example of how to configure your application with CDI by reading configuration attributes from a file..."
但我想知道是否有更标准的方式来代替创建配置工厂......
最佳答案
配置注解
package com.ubiteck.cdi;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.enterprise.util.Nonbinding;
import javax.inject.Qualifier;
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectedConfiguration {
/**
* Bundle key
* @return a valid bundle key or ""
*/
@Nonbinding String key() default "";
/**
* Is it a mandatory property
* @return true if mandator
*/
@Nonbinding boolean mandatory() default false;
/**
* Default value if not provided
* @return default value or ""
*/
@Nonbinding String defaultValue() default "";
}
配置工厂可能如下所示:
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
public class ConfigurationInjectionManager {
static final String INVALID_KEY="Invalid key '{0}'";
static final String MANDATORY_PARAM_MISSING = "No definition found for a mandatory configuration parameter : '{0}'";
private final String BUNDLE_FILE_NAME = "configuration";
private final ResourceBundle bundle = ResourceBundle.getBundle(BUNDLE_FILE_NAME);
@Produces
@InjectedConfiguration
public String injectConfiguration(InjectionPoint ip) throws IllegalStateException {
InjectedConfiguration param = ip.getAnnotated().getAnnotation(InjectedConfiguration.class);
if (param.key() == null || param.key().length() == 0) {
return param.defaultValue();
}
String value;
try {
value = bundle.getString(param.key());
if (value == null || value.trim().length() == 0) {
if (param.mandatory())
throw new IllegalStateException(MessageFormat.format(MANDATORY_PARAM_MISSING, new Object[]{param.key()}));
else
return param.defaultValue();
}
return value;
} catch (MissingResourceException e) {
if (param.mandatory()) throw new IllegalStateException(MessageFormat.format(MANDATORY_PARAM_MISSING, new Object[]{param.key()}));
return MessageFormat.format(INVALID_KEY, new Object[]{param.key()});
}
}
Tutorial with explanation and Arquillian test
关于configuration - 使用 ".properties"文件的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10165226/