2013-07-09 2 views
0

내 앱의 XML 설정 파일 (다소 Tomcat의 context.xml과 유사)에서 JNDI 조회를 정의하고 싶습니다. 그런 다음 내 앱에서 참조하십시오. 그런 다음 응용 프로그램은 JNDI를 사용하여 XML 파일에 저장된 정보로 객체를 찾습니다.XML 파일에서 JNDI InitialContext 구성

<app> 
    <!-- lots of stuff --> 

    <dataSource name="jdbc/myDB" 
     maxActive="50" maxIdle="30" maxWait="10000" 
     username="mysqluser" password="mysqlpassword" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/myDB"/> 

    <!-- lots of stuff --> 
</app> 

그런 다음, 내 응용 프로그램에서 :

public class DataSourceProvider { 
    public DataSource lookupDataSource(String name) { 
     DataSource dataSource = null; 
     try { 
      Context context = new InitialContext(); 
      dataSource = (DataSource) context.lookup("Database"); 
     } catch (NamingException e) { 
      // Handle... 
     } 

     return dataSource; 
    } 
} 

DataSourceProvider dsp = new DataSourceProvider(); 
DataSource myDB = dsp.lookupDataSource("myDB"); 

가 어떻게이 두 개념을 연결 않습니다 예를 들어

는 내 응용 프로그램의 XML 설정 파일에서 다음 코드를 부여? <dataSource/> XML 요소가 DataSourceVO 개체로 읽히는 것으로 가정 해보십시오. JNDI 조회를 수행 할 수 있도록 DataSourceVO 인스턴스의 InitialContext 인스턴스를 어떻게 구성합니까? 미리 감사드립니다!

업데이트 :

try{ 
    Hashtable env = new Hashtable(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, 
      "com.sun.jndi.ldap.LdapCtxFactory"); 
    env.put(Context.SECURITY_AUTHENTICATION, "simple"); 

    String securityPrincipal = domain + "\\" + user; 

    env.put(Context.SECURITY_PRINCIPAL, securityPrincipal); 
    env.put(Context.SECURITY_CREDENTIALS, password); 
    env.put(Context.PROVIDER_URL, "ldap://" + domainController); 

    ctx = new InitialDirContext(env); 
} catch (AuthenticationException ex) { 
    ex.printStackTrace(); 
} catch(NamingException nex){ 
    nex.printStackTrace(); 
} 

내가 무엇을 찾고 있어요 이다 : 나는이 예제를 발견? 그런 식으로 XML을 Hashtable (또는 이와 비슷한)으로 읽고 해당 테이블에서 InitialContext을 만들 수 있습니까? 그게 전부일까요?!?

+0

당신이 웹 응용 프로그램을 응용 프로그램입니다을 사용하여 데이터 소스를 구성 할 수있는 옵션이없는 경우? 그렇다면 context.xml에서 JNDI를 사용하지 않는 이유는 무엇입니까? 그렇지 않다면, 당신은 봄을 사용하고 단순히 의존성 주입을 사용하도록 고려 했습니까? – Rafa

+0

고마워요 @YoriKusanagi - 아닙니다, 스프링은 옵션이 아니며 아니오, 재사용 할 수있는 JAR이지 WAR가 아닙니다. –

+0

... ('context.xml '이 없으므로). –

답변

0

시도의 봄 http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/jdbc.html#jdbc-connections 참조 14.3.1 데이터 소스

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}"/> 
    <property name="url" value="${jdbc.url}"/> 
    <property name="username" value="${jdbc.username}"/> 
    <property name="password" value="${jdbc.password}"/> 
</bean> 

<context:property-placeholder location="jdbc.properties"/> 

봄이 다음 속성

Properties props = new Properties(); 

... load from properties file or XML 

BasicDataSource ds = new BasicDataSource(); 
for(Entry e : props.entrySet()) { 
    ds.addConnectionProperty((String)e.getKey(), (String)e.getValue()); 
} 
+0

감사합니다. @Evgeniy Dorofeev (+1) - 어떻게 Javax Mail 세션에서도이 작업을 수행 할 수 있습니까? 나는 jdbc/myDB 또는 smtp/myMailServer를 지정했는지 여부가 동일하기 때문에 JNDI를 범위 지정했다. 예를 들어, JAR에 RDBMS 서버가 아닌 메일 서버용 리소스가 포함 된'context.xml' 파일이 포함되어 있다고 가정 해 봅시다. JNDI가 여기에있는 방법이라고 생각합니다. –

+0

안녕하세요. @Evgeniy Dorofeev - 내 업데이트를보고 내가 찾고있는 것을 볼 수 있습니까? 다시 한 번 감사드립니다! –

관련 문제