2013-03-06 2 views
3

하지만, 응용 프로그램 서버 외부에있을 수없는 것 같습니다.스프링의 IoC와 Java EE

나는 다음과 같은

public class Driver { 

    public static void main(String args[]) 
    { 

    InitialContext ic; 

    try { 

     ic = new InitialContext(); 
     // JNDI lookup 
     MyClass myClass = (MyClass)ic.lookup("java:module/MyClass");    
    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 

지금까지이 방법 나는 javax.naming.NoInitialContextException을 얻을 것을 시도하고있다. 내 질문은 Java EE를 사용하여 독립 실행 형 응용 프로그램에서 IoC 기능을로드하는 방법입니다.

EDIT 도움 주셔서 감사합니다 ... OpenWebBeans CDI 구현과 함께 ... 도움을 주셔서 감사합니다.

답변

2

현재 IoC가 아닌 JNDI으로 작업하고 있습니다.

독립 실행 형 응용 프로그램에서 JNDI가 "jndi 클라이언트"용 원격 데이터 google을 찾으려면 JNDI가 필요합니다. 당신이 당신의 자바 EE 애플리케이션에서 IOC의를 사용하려면

- 당신은 웹 컨테이너 또는 응용 프로그램 서버 외부 JNDI 자원을 얻기 위해 필요한 경우 CDI

0

을 확인하고 lookup 전에 바인드 자원이 필요합니다. 바인딩하기 전에 javax.naming.spi.InitialContextFactory 구현을 구현하고 등록해야합니다.

가장 쉬운 방법은 전 세계 모든 바인딩을 유지하는 것이 좋습니다 java.util.concurrent.ConcurrentHashMap. 는 그래서 다음과 같이한다 (이것은 가장 쉬운 해결책이 염두에 두어야하고, 어떤 경우에는 제대로 작동하지 않을 수 있습니다하십시오 그러나 당신의 특정 요구를 만족) :

public class Driver { 

    //static initializtion 
    static { 
     //registering you custom InitialContextFactory 
     //note, that you can register it in some other way, check http://docs.oracle.com/javase/jndi/tutorial/beyond/env/source.html 
     System.setProperty("java.naming.factory.initial", SimpleInitialContextFactory.class.getName()); 

     bindMyClass(); 
    } 

    private static void bindMyClass(){ 
     try { 
      InitialContext context = new InitialContext(); 
      context.bind("java:module/MyClass", new MyClass()); 
     } catch (NamingException ignored) {} 
    } 

    public static void main(String args[]) throws Exception { 
     InitialContext ic = new InitialContext(); 
      // JNDI lookup 
     MyClass myClass = (MyClass)ic.lookup("java:module/MyClass");//should find it 
    } 
} 

class SimpleInitialContextFactory implements InitialContextFactory { 

     @Override 
     public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException { 
      return new MapBasedContext(environment); 
     } 
    } 

public class MapBasedContext implements Context { 
    //actual holder of context 
    private static Map values = new ConcurrentHashMap(); 

    public MapBasedContext() { 
    } 

    public MapBasedContext(Hashtable<?, ?> environment) { 
     values.putAll(environment); 
    } 

    @Override 
    public void bind(String name, Object obj) throws NamingException { 
     values.put(name, obj); 
    } 

    @Override 
    public Object lookup(String name) throws NamingException { 
     return values.get(name); //you may throw an exception in case if name is absent 
    } 

    //TODO everything else should be implemented, but actual methods bodies aren't required 
} 
+0

하이 트롤 수있는 곳이 아니다 생각합니다. 나는 이것을 시도했지만 여전히 명명 예외를 던지고있다. "환경 또는 시스템 특성 또는 애플릿 매개 변수로 클래스 이름을 지정해야합니다." – Barry

+0

@ 배리,이 경우에는'javax.naming.spi.InitialContextFactory'를 구현하여 시스템 속성에 넣어야 할 필요가 있습니다. 업데이트 된 답변에서 제공 한 것과 아주 비슷한 것입니다. – n1ckolas

0

CDI 봄 "과 동일 "Java EE 6
에서 (사실 그것은 Context와 DI 기능 만 다루고 있습니다. 다른 것들은 EJB 나 JPA 같은 다른 JSR 구현에 의해 다루어 지지만 문제가 DI를 사용하는 것이라면 완벽하게 맞을 것입니다. 그러나 Spring/Java EE 기능 (예 : 컨테이너 관리 트랜잭션)
독립 실행 형 응용 프로그램에서 실행하려면 Jboss WELD CDI 구현으로 이동하십시오.

개인적으로 나는 그 대답에 대한 감사가 컨텍스트와 DI 관리를위한 봄보다 더 farly 더 나은,하지만 여기