2016-06-14 28 views
0

프로젝트에서 bean 인터페이스를 가질 수 있으며 종속성으로 이전 프로젝트를 포함하는 다른 프로젝트에서 해당 Bean을 구현할 수 있습니까? 두 번째 프로젝트에 지금다른 프로젝트에서 Bean 인터페이스와 Bean 구현

package com.proj1.util.exception; 
import .....; 

public class ExceptionHandler extends RuntimeException ... { 
    private String errorMessage; 

    @Override 
    public void handle() { 
     Util.getBeanInstance(Notification.class).addError(errorMessage); 
    }  

} 

내가의 실제 구현이 : 같은 프로젝트 (즉으로 Proj1) 나는 또한 다음과 같은 클래스가에서

package com.proj1.util; 
import .....; 

public interface Notification { 

    addNotification(); 
    addError();  

} 

:

나는 다음과 같은 인터페이스를 가지고 Notification은 다음과 같습니다 :

package com.proj2.beans; 

@Named 
@ConversationScoped 
public class NotificationBean implements Notification, Serializable { 
    private static final long serialVersionUID = 1L; 

    ... 
} 

이 상황은 e 메시지와 함께 톰캣에서 xception "범위 유형 주석 @ConversationScoped와 WebBeans 상황이 현재의 thread 내에 존재하지 않는다"

내 제안은 내 NotificationBean을 생산하는 공장을 추가했지만 훨씬 변경하지 않는 것.

package com.proj2.beans.cdi; 

import javax.enterprise.inject.New; 
import javax.enterprise.inject.Produces; 

import com.proj1.util.Notification; 

public class NotificationBeanFactory { 

    @Produces 
    public Notification create(@New NotificationBean notificationBean) { 
     return notificationBean; 
    } 
} 

질문은 빈 구현이 다른 프로젝트에있는 동안 인터페이스 만있는 프로젝트에서 어떻게 빈을 사용할 수 있습니까? 가능한가?

+0

예외는 문제의 스레드 (bean을 얻으려고 시도한 스레드)가 HTTP 요청 스레드가 아님을 제시합니다. 즉, HTTP 대화 및 HTTP 세션과 같은 HTTP 관련 범위를 사용할 수 없습니다. 사실입니까? 그러면 정확히 왜 '@ ConversationScoped'입니까? 컨테이너가 실제 빈 인스턴스를 정확히 어디에 저장 했습니까? – BalusC

+0

브라우저에서 요청한 JSF 응용 프로그램이므로 HTTP 요청입니다. 대화가 아직 시작되지 않았기 때문일 수도 있습니다. 'NotificationBean'은 실제로 내 응용 프로그램에 대한 내 메시지 (오류, 경고 등)를 관리해야합니다. 세션 스코프를 만드는 것이 더 현명합니까? –

답변

1

예외적으로 실행중인 대화가 없으므로 언제 @ConversationScoped 빈을 사용하려고 할 때부터 시작해야할지 결정해야합니다. 활성 대화가 당신이 볼 수있는 예외로 이어질하지 수있을 때 이것을 사용하려고

Util.getBeanInstance(Notification.class).add(...); 

:

귀하의 코드 조각 ExceptionHandler 클래스는 우리가 어떤 사람에 대해 모르는 마법의 공식을 호출하는 것을 나타냅니다. 따라서 @Inject ExceptionHandlerNotificationBean으로 설정하면 대화가 활성화되어있는 동안에 만 사용할 수 있습니다.

다른 프로젝트의 인터페이스 및 임프린트에 관한 용접 질문은 다음과 같습니다. 것이 가능하다. proj2 Weld는 단순히 콩 NotificationBean을 식별 할 것이며 유형 중에는 Notification이기도하므로 @Inject Notification이 될 수 있습니다. proj1에서 proj1 자체에는 해당 인터페이스를 구현할 bean이 없으므로 @Inject Notification을 사용할 수 없습니다.

+0

'Util.getBeanInstance (...)'는 BeanManager를 사용하여 Bean을 가져 와서 요청 된 Bean을 반환하는 유틸리티 메소드 세트입니다. 대화가 열리지 않는 한 실제로 전체 디자인이 작동합니다.그리고 그것은 특정 대화를 열기 전에 내 응용 프로그램이 실패하고 오류 메시지 알림을 출력하려고하기 때문에 일어나는 일입니다. –