2012-11-12 3 views
3

나는 두 개의 모듈, "BIZ"와 "EJB는"이런 식으로 뭔가를해야만 포함하는 모듈 받는다는 프로젝트가 : 보시다시피받는다는 순환 종속성이

//PART OF "BIZ" Module: 

public interface MyInterface{ 

public void foo(); 

} 
............................................ 
public class ImplFactory{ 

public static MyInterface getInterfaceImplementation(){ 
MyInterface ret=null; 
Class<? extends MyInterface> cl = null; 
       try { 
        cl= (Class<? extends MyInterface>) Class.forName("InterfaceImpl"); 
        ret= cl.newInstance(); 
        } 
       .... 
       ret ret; 
} 
....................................... 
public class MyClassX{ 

    public static void doSomethingX(){ 

    } 
} 

//PART OF "EJB" Module: 

public class InterfaceImpl implements MyInterface 
@EJB 
private MyEJB1 ejb1; 

public void foo(){ 
    ejb1.doSomething(); 
} 
........................................ 
@Stateless 
public class MyEJB1{ 

    public void doSomething(){ 
    ... 
    MyClassX.doSomethingX(); 
    .... 
    } 

} 

"EJB"는 "BIZ"에 따라 달라집니다MyClassX을 사용합니다 (실제로는 여러 클래스의 BIZ를 사용합니다). 이것이 ImplFactory이 리플렉션을 사용하여 InterfaceImpl을 인스턴스화하는 이유입니다. 문제는 입니다. cl.newInstance()ClassCastException을 던집니다. 두 모듈은 각각 WAR 및 JAR (모듈 "EJB"는 type = "ejb"을 지정하고 maven ejb 플러그인을 사용하여 컴파일 됨)에 속해 있습니다. 다른 ClassLoader (JBoss 7에서 실행 됨). 반면에 InterfaceImpl은 작업에 대해 MyEJB1이 필요하므로 BIZ로 이동할 수 없으며 주기적 종속성이 도입됩니다.

내 질문은 : 어떻게 프로그래밍 방식으로 또는 구성을 변경하여이 까다로운 상황을 해결하겠습니까? 나를 도울 수 있기를 바랍니다. 감사!

+1

첫 번째 질문 : 공장 대신 DI를 사용하는 이유는 무엇입니까? – khmarbaise

+0

현재 상황을 그대로 유지할 수 있습니다. 상황을 과장했지만, getInterfaceImplementation()을 사용하여 수십 개의 클래스를 다루고 있습니다. (즉, 두 번째로 고려할 것입니다.) – Federico

+0

나는 이제 호기심 .. :) 어떻게 CDI가 설명 된 문제를 해결하는 데 도움이 될까요? – Federico

답변

3

이러한 종속성을 조금 더 분할해야합니다. 이 같은

뭔가 더 나은 것 :

 
. 
├── pom.xml 
├── my-api ("API") 
| ├── pom.xml 
| └── src 
|  └── main 
|   └── java 
|    └── my 
|     └── package 
|      └── MyInterface.java 
├── my-ejb ("EJB") 
| ├── pom.xml 
| └── src 
|  └── main 
|   └── java 
|    └── my 
|     └── package 
|      └── InterfaceImpl.java 
└── my-web ("BIZ") 
    ├── pom.xml 
    └── src 
     └── main 
      ├── java 
      | └── my 
      |  └── package 
      |   └── ImplFactory.java 
      └── webapp 
       └── WEB-INF 
        └── web.xml 

BIZAPI에 따라 EJB에 따라 달라집니다.

이제는 즉각적인 문제를 해결할 것입니다.하지만 그 공장을 만들 것을 권장하지는 않습니다. 대신 CDI을 사용해야하지만 다른 이야기입니다.

+0

안녕하세요! 답변 해 주셔서 감사합니다! 문제는 불행히도 EJB가 BIZ에 달려 있다는 것입니다. – Federico

+0

@Federico 그건 당신이 나눌 필요가 있습니다. – maba

0

이것이 도움이 될지 모르겠지만 단지 내가 사용했던 몇 가지 것을 공유하고 있습니다. i. 주기적인 의존성 때문에 내 전쟁 파일에 src 모듈이있을 때했던 한 가지. 참조 모듈은 다음과 같이 maven dep somethin을 추가하여 전쟁에서 jar 파일을 가져올 수 있습니다. (정확한 구문을 정확히 알지 못함)

ii. 한 경우에 나는 자체 중복의 전쟁 모듈 bcuz의 src를 호출 할 수 없었다. 그렇다면 별도의 src 모듈을 만들어서 그것이 필요했던 모든 war 모듈에 의존성으로 추가해야했습니다.

도움이 될지 잘 모르겠습니다. 내가 아는 것을 공유하고 싶었습니다. 내 의견을 개선 할 수 있다면 알려주십시오.

+0

안녕하세요. 답변 해 주셔서 감사합니다. 그러나 솔직히 저는 여러분이하고 싶은 말을 이해하지 못했습니다. ( – Federico

+0

몇일 동안 코드를 공유하고 제 경우에 대해 더 설명해 보겠습니다. 인내심에 감사드립니다. –