我有几个应用程序properties
文件,我很好奇,如果它会更容易存储这些username
/ password
/ server-url-to-login-to
连击的JNDI查找,而不是这个明确的文本文件,一个.jar 。
有几个问题:
- 你可以存储在不使用JNDI数据库凭据?
- 你如何配置一个新的JNDI资源来存储这些属性呢?
- 你会如何检索资源这些属性?
最让我阅读文档的是如何建立JNDI数据库连接,并为我所用,我没有连接到任何数据库,而是不同类型采用不同的认证方案的Web服务(在请求消息SOAP用户名/密码, HTTP基本,头,SSL等)。
该问题的答案:
- 你可以存储在不使用JNDI数据库凭据?
是。
- 你如何配置一个新的JNDI资源来存储这些属性呢?
如果您使用的是GlassFish 2,你必须创建自定义PropertiesObjectFactory
类来处理JNDI
的特性java.util.Porperties
。
对于如PropertiesObjectFactory
类看起来是这样的:
public class PropertiesObjectFactory implements Serializable, ObjectFactory {
public static final String FILE_PROPERTY_NAME = "org.glassfish.resources.custom.factory.PropertiesFactory.fileName";
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment)
throws Exception {
Reference ref = (Reference) obj;
Enumeration<RefAddr> refAddrs = ref.getAll();
String fileName = null;
Properties fileProperties = new Properties();
Properties properties = new Properties();
while (refAddrs.hasMoreElements()) {
RefAddr addr = refAddrs.nextElement();
String type = addr.getType();
String value = (String) addr.getContent();
if (type.equalsIgnoreCase(FILE_PROPERTY_NAME)) {
fileName = value;
} else {
properties.put(type, value);
}
}
if (fileName != null) {
File file = new File(fileName);
if (!file.isAbsolute()) {
file = new File(System.getProperty("com.sun.aas.installRoot") + File.separator + fileName);
}
try {
if (file.exists()) {
try {
FileInputStream fis = new FileInputStream(file);
if (fileName.toUpperCase().endsWith("XML")) {
fileProperties.loadFromXML(fis);
} else {
fileProperties.load(fis);
}
} catch (IOException ioe) {
throw new IOException("IO Exception during properties load : " + file.getAbsolutePath());
}
} else {
throw new FileNotFoundException("File not found : " + file.getAbsolutePath());
}
} catch (FileNotFoundException fnfe) {
throw new FileNotFoundException("File not found : " + file.getAbsolutePath());
}
}
fileProperties.putAll(properties);
return fileProperties;
}
}
作出这样的类的罐子,把它添加到GlassFish的全局类路径。 这将是: /glassfish/domains/domain1/lib
,然后你可以指定它作为你的一个工厂类JNDI
属性配置。
Glassfish的3已经有了性工厂类。 它被设置成: org.glassfish.resources.custom.factory.PropertiesFactory
。
打开GlassFish管理控制台,并导航到:资源- > JNDI - >自定义资源,单击“新建”,提供了一个JNDI名称,如: jndi/credentials
,选择资源型java.util.Properties
,指定工厂类: org.glassfish.resources.custom.factory.PropertiesFactory
,然后单击“添加属性”,用于如指定名称: testUsernameName
和值列testUsernameValue
。 单击确定,那就是一切,你已经配置JNDI
资源。 :只要你喜欢这个,你可以添加尽可能多的性能jndi/credentials
的资源。
不要忘记,当您完成创建资源重新启动应用服务器。
- 你会如何检索资源这些属性?
public Properties getProperties(String jndiName) {
Properties properties = null;
try {
InitialContext context = new InitialContext();
properties = (Properties) context.lookup(jndiName);
context.close();
} catch (NamingException e) {
LOGGER.error("Naming error occurred while initializing properties from JNDI.", e);
return null;
}
return properties;
}
例如如何获得的财产:
String username = someInstance.getProperties("jndi/credentials").getProperty("testUsernameName");
你的username
是: testUsernameValue
。
当调用应用程序中的这种方法提供了一个JNDI
你在你的应用程序服务器配置的名称: jndi/credentials
。 如果您在部署描述符中映射的资源,你必须使用: java:comp/env/jndi/credentials
。
如果你想要做的使用相同的Spring
:
<jee:jndi-lookup id="credentials"
jndi-name="jndi/credentials"/>
那么我希望完蛋了。 希望这可以帮助。