如何在GlassFish 4中修改Web环境条目

时间:2014-01-27 09:34:39

标签: java jndi glassfish-4

web.xml我的webapp应用程序中,我有以下元素:

<env-entry>
    <env-entry-name>aMessage</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>Hello World</env-entry-value>
</env-entry>

此Web应用程序中的EJB可以读取它:

final InitialContext context = new InitialContext();
final Context env = (Context) context.lookup("java:comp/env");
System.out.println("MSG: " + env.lookup("aMessage")); // prints Hello World

现在我正尝试使用asadmin更改该值:

martin@bono:~/glassfish4/glassfish/bin$ ./asadmin set-web-env-entry --name=aMessage --value=test webapp
Previous env-entry setting of aMessage for application/module webapp was overridden.
Command set-web-env-entry executed successfully.

martin@bono:~/glassfish4/glassfish/bin$ ./asadmin list-web-env-entry webapp
Reported 1 env-entry setting
aMessage (java.lang.String) = test ignoreDescriptorItem=true //
Command list-web-env-entry executed successfully.

不幸的是,即使重新启用此Web应用程序或重新启动Web服务器,我的EJB仍会打印旧值“Hello World”。

我还试图set-web-env-entry找到web.xml中未定义的名称,并使用--ignoredescriptoritem参数进行播放,但没有任何帮助。枚举整个环境也不会显示任何其他或更改的Web环境条目,但会显示旧版本以及与此问题无关的许多其他对象:

final NamingEnumeration<Binding> enu = env.listBindings("");

while (enu.hasMore()) {
    final Binding binding = enu.next();
    System.out.println(binding);
}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

这似乎是一个错误 - 但我有另一种解决方案可满足您的需求。您可以使用glassfish中提供的自定义资源。您必须在domain.xml中声明自定义资源

<resources>
    <custom-resource factory-class="org.glassfish.resources.custom.factory.PropertiesFactory" res-type="java.util.Properties" jndi-name="test/properties">
      <property name="aMessage" value="Hello World"></property>
    </custom-resource>
</resources>

然后你可以在代码中使用它



public class Environment
{

  public String getProperty() {

      InitialContext ctx = new InitialContext();
      properties = (Properties) ctx.lookup("test/properties");
      if(properties == null) {
          return "default value - hello";
      }

      return properties.getProperty("aMessage");    

  }

}

这种方法的一个缺点是自定义资源对整个域都是全局的。但是,此解决方案的优势还在于您可以使用asadmin和admin Web控制台来更改资源。