WildFly 命名子系统:如何绑定到 java.util.Properties 对象

WildFly naming subsystem: how to bind to a java.util.Properties object

我打算在 WildFly 应用程序服务器中定义类型为 java.util.Properties 的 JNDI 属性,以便从我的应用程序中读取它。

in the an older WildFly documentation所述,可以创建对象工厂类型的全局绑定。在这个例子中是一个可选的 environment 标签来保存多个 key/value 对。这将准确映射我在读取 JNDI 资源时获得 java.util.Properties 的愿望。

问题是天气已经有 javax.naming.spi.ObjectFactory 的实现来从对象工厂绑定中创建一个 java.util.Properties 对象,还是我需要自己实现它并将它作为一个单独的安装模块(如 mastertheboss.com/... 中所述)?

好的,我自己实现了它。

package com.myorg.wildfly.objectfactory;

...

public class WildFlyPropertiesObjectFactory implements ObjectFactory
{
  @Override
  public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception 
  {
    Properties p = new Properties();
    if(environment != null)
    {
      Set<?> keySet = environment.keySet();
      for(Object key : keySet)
      {
        p.put(key, environment.get(key));
      }  
    }
    return p;
  }
}
  • 清理并将这个 class 构建到 JAR 文件中 wildfly-properties-objetfactory.jar

  • 通过jboss-cli.sh

    添加模块

    module add --name=my.jndi.propertyreader --resource=wildfly-properties-objetfactory.jar --dependencies=javax.api

  • 通过jboss-cli.sh

    创建命名绑定

    /subsystem=nameing/binding=java\:\/my_super_cool_jndi_name:add(binding-type=object-factory, module=my.jndi.propertyreader, class=com.myorg.wildfly.objectfactory.WildFlyPropertiesObjectFactory, environment=[key1=value1, key2=value2])

在我的应用程序中,我可以通过

在 CDI bean 中访问它
public void test() {
  Properties p = (Properties) new InitialContext().lookup("java:/my_super_cool_jndi_name");
  System.out.printf("Properties: %s%n", p);
}

或如the mentioned link所示将其作为直接依赖注入@Resource(lookup = "java:/my_super_cool_jndi_name") Properties p;

很有魅力。