Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式为Spring创建JNDI数据源_Java_Spring_Mocking_Jndi_Initial Context - Fatal编程技术网

Java 以编程方式为Spring创建JNDI数据源

Java 以编程方式为Spring创建JNDI数据源,java,spring,mocking,jndi,initial-context,Java,Spring,Mocking,Jndi,Initial Context,我有一个现有的基于Spring web的应用程序,它有使用JNDI定义的数据源,我正在尝试创建一个独立的应用程序来使用bean。如何在独立应用程序中以编程方式创建JNDI条目和数据库属性 <bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/jdbc/MyDS" />

我有一个现有的基于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());
}

org.springframework.test
依赖项通过以下方式提供支持:

这应该行得通


干杯,

我试过了,但在线程“main”org.springframework.beans.factory.BeanCreationException中出现了错误“异常”:创建名为“myDataSource”的bean时出错,该bean在类路径资源[applicationContext.xml]中定义:调用init方法失败;嵌套异常为javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名,或作为小程序参数,或在应用程序资源文件中指定:java.naming.factory.initial'My bad,当然,在尝试创建Spring上下文之前,应该创建并激活JNDI树——我已经相应地编辑了答案。您能给我一个合理的解释,为什么这个解决方案在使用jtaDataSource时会给我一个错误吗?
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();
    }
}
// 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( "..." );