java 以编程方式为 Spring 创建 JNDI 数据源
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14982125/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Programmatically creating a JNDI DataSource for Spring
提问by acvcu
I have an existing Spring web-based application that has datasources defined using JNDI, and I'm trying to create a standalone app to use the beans. How can I create the JNDI entry and database properties programmatically in the standalone application?
我有一个现有的基于 Spring Web 的应用程序,它具有使用 JNDI 定义的数据源,我正在尝试创建一个独立的应用程序来使用 bean。如何在独立应用程序中以编程方式创建 JNDI 条目和数据库属性?
<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/MyDS" />
</bean>
public static void main(String[] args) {
// this throws an error since the JNDI lookup fails - can I programmatically define the database properties here?
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = ctx.getBean(UserService.class);
User user = userService.findUserById("jdoe");
System.out.println("display name: " + user.getDisplayName());
}
EDIT:
编辑:
I tried something like this, but am now getting the error "javax.naming.NoInitialContextException: Need to specify class name in environment or system property"
我尝试过这样的事情,但现在出现错误“javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名”
public static void main(String[] args) {
setupJNDI();
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = ctx.getBean(UserService.class);
User user = userService.findUserById("jdoe");
System.out.println("display name: " + user.getDisplayName());
}
private static void setupJNDI() {
InitialContext ic;
try {
ic = new InitialContext();
ic.createSubcontext("java:");
ic.createSubcontext("java:/comp");
ic.createSubcontext("java:/comp/env");
ic.createSubcontext("java:/comp/env/jdbc");
SQLServerConnectionPoolDataSource myDS = new SQLServerConnectionPoolDataSource();
opaDS.setServerName("myserver");
opaDS.setPortNumber(1433);
opaDS.setUser("user");
opaDS.setPassword("password");
ic.bind("java:/comp/env/jdbc/MyDS", myDS);
} catch (NamingException e) {
e.printStackTrace();
}
}
采纳答案by Anders R. Bystrup
The org.springframework.test
dependency has support for that via the SimpleNamingContextBuilder
:
该org.springframework.test
相关性具有经由支持SimpleNamingContextBuilder
:
// First create the mock JNDI tree and bind the DS
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
DataSource ds = new ComboPooledDataSource();
ds.setDriverClass( ... ); // etc. for uid, password, url
builder.bind( "java:comp/env/jdbc/MyDS" , ds );
builder.activate();
// Then create the Spring context, which should now be able
// to resolve the JNDI datasource
ApplicationContext context = new ClassPathXmlApplicationContext( "..." );
That should work.
那应该有效。
Cheers,
干杯,