【问题标题】:Alternative to using property files for enviroment settings of Java EE application在 Java EE 应用程序的环境设置中使用属性文件的替代方法
【发布时间】:2014-07-03 09:19:02
【问题描述】:
我正在开发在属性文件中存储环境相关数据(如邮件详细信息、数据库连接密码)的胖客户端 java 应用程序。
如果应用程序尝试加载时缺少属性文件,则需要发送致命邮件。但是为了发送邮件,它需要属性文件。因为它包含所有邮件详细信息。由于缺少属性文件,因此会导致大问题。
所以请建议我使用除 java 代码之外的属性文件的替代方法。
是否可以在 websphere 中存储属性文件?
【问题讨论】:
标签:
jakarta-ee
properties
configuration
websphere
jndi
【解决方案1】:
在 WebSphere Application Server 中,这是通过使用 Resource Environment Entry 来完成的。您需要执行以下操作:
-
创建一个从 JNDI 读取属性的 javax.naming.spi.ObjectFactory 的实现。
基本代码可能如下所示:
public Object getObjectInstance(Object object, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {
Properties properties = new Properties();
Reference ref = (Reference) object;
Enumeration addrs = ref.getAll();
while (addrs.hasMoreElements()) {
RefAddr addr = (RefAddr) addrs.nextElement();
String entryName = addr.getType();
String value = (String) addr.getContent();
properties.setProperty(entryName, value);
}
return properties;
}
在服务器中将实现类注册为Resource Environment Provider。按照New Resource environment provider 中描述的步骤操作。
定义Resource Environment Entry并将其绑定到新注册的提供者——Resource environment entry settings
在条目中创建您需要的自定义属性。
将 Resource Environment Entry 绑定到应用程序中的 Java EE 模块 - 这可以通过不同的方式完成,具体取决于模块的类型。
如果您需要更多详细信息,这里有一个综合指南 – Using resource environment providers in WebSphere Application Server。如果您使用的是 WAS 7.0 或更高版本,则无需将提供程序放在共享库中 - 它可以直接驻留在应用程序中。
至于存储凭证,有一个特殊的工具——J2C Authentication Alias,正如Gas 所指出的那样。
【解决方案2】:
您始终可以为您的应用程序属性设置默认值,因此这可能是邮件配置的解决方案,前提是有一个固定的默认值。
另一种方法是使用存储在数据库中的应用程序属性。当然,这需要有一个数据库连接(但这在应用程序或容器的持久性配置中很常见)。
正如this post's answer 中已经说过的,我们在所有的网络应用程序中都使用了这种技术,主要有两个原因:
可以在运行时完成对属性的更改,而无需监视文件更改,它们可以由应用程序本身完成,并且不需要知道已部署应用程序之外的路径。
属性可以包含其他信息,例如类型(例如数字、日期、字符串)、默认值、注释或更改它的用户。
为了实现它,您将创建一个应用程序范围的组件,该组件访问应用程序其余部分的数据库属性。
【解决方案3】:
您可以通过控制台(环境 > 命名 > 命名空间绑定)将字符串属性存储在 JNDI 树中,然后通过 InitialContext 访问它们。
但对于数据库或邮件服务器等资源,您应该创建 DataSource、J2C 身份验证别名或 MailSession 条目,然后在应用程序安装期间将其映射到应用程序资源。