7

JBoss 7.1.1 AS にデプロイするいくつかの独立した Java EE モジュール (WAR Web アプリケーション、および JAR EJB モジュール) があります。したい:

  1. これらのモジュールの構成を 1 つの *.properties ファイルに一元化します。
  2. このファイルをクラスパスで使用できるようにします。
  3. このファイルのインストール/構成は、できるだけ単純にしてください。理想的には、${JBOSS_HOME}/standalone/configuration のような JBoss フォルダーに配置するだけです。
  4. アプリケーション サーバーを再起動せずに、このファイルを変更できるようにします。

これは可能ですか?

私はすでにこのリンクを見つけました: How to put an external file in the classpath、これを行うための好ましい方法は、静的 JBoss モジュールを作成することであると説明しています。しかし、デプロイするすべてのアプリケーション モジュールでこの静的モジュールへの依存関係を作成する必要があります。これは、回避しようとしている一種の結合です。

4

2 に答える 2

4

このサイトから取得した、CDI のみを使用した完全な例を次に示します。

この設定は、JBoss AS7 でも機能します。

  1. WildFly 構成フォルダー内にプロパティー・ファイルを作成して入力します

    $ echo 'docs.dir=/var/documents' >> .standalone/configuration/application.properties
    
  2. システム プロパティを WildFly 構成ファイルに追加します。

    $ ./bin/jboss-cli.sh --connect
    [standalone@localhost:9990 /] /system-property=application.properties:add(value=${jboss.server.config.dir}/application.properties)
    

これにより、サーバー構成ファイル (standalone.xml または domain.xml) に以下が追加されます。

<system-properties>
    <property name="application.properties" value="${jboss.server.config.dir}/application.properties"/>
</system-properties>
  1. アプリケーション全体のプロパティをロードおよび保存するシングルトン セッション Bean を作成する

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    
    import javax.annotation.PostConstruct;
    import javax.ejb.Singleton;
    
    @Singleton
    public class PropertyFileResolver {
    
        private Logger logger = Logger.getLogger(PropertyFileResolver.class);
        private String properties = new HashMap<>();
    
        @PostConstruct
        private void init() throws IOException {
    
            //matches the property name as defined in the system-properties element in WildFly
            String propertyFile = System.getProperty("application.properties");
            File file = new File(propertyFile);
            Properties properties = new Properties();
    
            try {
                properties.load(new FileInputStream(file));
            } catch (IOException e) {
                logger.error("Unable to load properties file", e);
            }
    
            HashMap hashMap = new HashMap<>(properties);
            this.properties.putAll(hashMap);
        }
    
        public String getProperty(String key) {
            return properties.get(key);
        }
    }
    
  2. CDI 修飾子を作成します。注入したいJava変数でこの注釈を使用します。

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    import javax.inject.Qualifier;
    
    @Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR })
    public @interface ApplicationProperty {
    
        // no default meaning a value is mandatory
        @Nonbinding
        String name();
    }
    
  3. プロデューサー メソッドを作成します。これにより、注入されるオブジェクトが生成されます

    import javax.enterprise.inject.Produces;
    import javax.enterprise.inject.spi.InjectionPoint;
    import javax.inject.Inject;
    
    public class ApplicationPropertyProducer {
    
        @Inject
        private PropertyFileResolver fileResolver;
    
        @Produces
        @ApplicationProperty(name = "")
        public String getPropertyAsString(InjectionPoint injectionPoint) {
    
            String propertyName = injectionPoint.getAnnotated().getAnnotation(ApplicationProperty.class).name();
            String value = fileResolver.getProperty(propertyName);
    
            if (value == null || propertyName.trim().length() == 0) {
                throw new IllegalArgumentException("No property found with name " + value);
            }
            return value;
        }
    
        @Produces
        @ApplicationProperty(name="")
        public Integer getPropertyAsInteger(InjectionPoint injectionPoint) {
    
            String value = getPropertyAsString(injectionPoint);
            return value == null ? null : Integer.valueOf(value);
        }
    }
    
  4. 最後に、プロパティを CDI Bean の 1 つに挿入します。

    import javax.ejb.Stateless;
    import javax.inject.Inject;
    
    @Stateless
    public class MySimpleEJB {
    
        @Inject
        @ApplicationProperty(name = "docs.dir")
        private String myProperty;
    
        public String getProperty() {
            return myProperty;
        }
    }
    
于 2015-03-11T20:41:42.017 に答える