EJB3.1属性文件注入

时间:2011-07-28 07:18:11

标签: java-ee ejb-3.1

有一些简单的方法可以将从类路径加载文件的Properties类注入到EJB(3.1)中吗?

这样的事情:

@Resource(name="filename.properties", loader=some.properties.loader)
private Properties someProperties;

谢谢,

博若

2 个答案:

答案 0 :(得分:3)

正如bkail所说,你可以通过以下方式实现这一目标。我不确定你的loader=some.properties.loader到底意味着什么,所以我不想做任何事情,但是如果你想使用loader.getClass().getResourceAsStream ("filename.properties");加载

,请提供选项

首先定义您的注射类型

@BindingType
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD,
        ElementType.PARAMETER })
public @interface PropertiesResource {

    @Nonbinding
    public String name();

    @Nonbinding
    public String loader();

}

然后为该

创建一个生产者
public class PropertiesResourceLoader {

    @Produces
    @PropertiesResource(name = "", loader = "")
    Properties loadProperties(InjectionPoint ip) {
        System.out.println("-- called PropertiesResource loader");
        PropertiesResource annotation = ip.getAnnotated().getAnnotation(
                PropertiesResource.class);
        String fileName = annotation.name();
        String loader = annotation.loader();
        Properties props = null;
        // Load the properties from file
        URL url = null;
        url = Thread.currentThread().getContextClassLoader()
                .getResource(fileName);
        if (url != null) {
            props = new Properties();
            try {
                props.load(url.openStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return props;
    }
}

然后将其注入您的命名组件。

@Inject
@PropertiesResource(name = "filename.properties", loader = "")
private Properties props;

我这样做是为了查看焊接文档,其中给出了@HttpParam作为示例here。这是按照焊接1.1.0,在焊接1.0.0中,获取注释可以像这样完成

PropertiesResource annotation = ip.getAnnotation(PropertiesResource.class);

答案 1 :(得分:1)

如果您使用的应用程序服务器将WELD作为CDI实现(例如Glassfish 3.x或JBoss 7.x或Weblogic 12),那么您希望使用WELD 扩展名,在WELD文档中here

就像将它添加到您的POM一样简单

<dependency>
   <groupId>org.jboss.weld</groupId>
   <artifactId>weld-extensions</artifactId>
  <version>${weld.extensions.version}</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>