在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);
}
我做错了什么?
答案 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控制台来更改资源。