2011-09-22 8 views
2

Weld 문서를 읽었을 때부터이 작업을 수행 할 수 있다고 생각지 않지만 실제로 할 수 있다고 생각 했으므로 CDI를 사용하는 방법이 없다면 어쩌면 패턴 해결 방법이 있습니다 ...Weld CDI : 하나의 빈 클래스를 여러 한정자 중 하나를 만족시키는 방법?

@Qualifier 
@Target({TYPE, METHOD, FIELD, PARAMETER}) 
@Retention(RUNTIME) 
public @interface JobBinding { 
    JobType value(); 
} 

JOBTYPE은 열거입니다 :

public enum JobType { 

    JOB_A, 
    JOB_B, 
// etc - there are quite a few 

대부분의 작업이 약간 다른 방식으로 구축 필요하다고, 그래서 관련 빌더 수업을

나는 멤버로 정의 규정을 만들었습니다 일자리. 내가 구축해야하는 경우

@JobBinding(JobType.JOB_A) 
public class JobABuilder implements JobBuilder { 
.... 

, 나는 프로그램 조회를 사용합니다 :

public class JobBindingQualifier extends AnnotationLiteral<JobBinding> implements JobBinding { 

    private static final long serialVersionUID = -822150300665931157L; 

    private JobType type; 

    public JobBindingQualifier(JobType type) { 
     this.type = type; 
    } 

    @Override 
    public JobType value() { 
     return type; 
    } 
} 

:

@Inject @Any 
private Instance<JobBuilder> builderSource; 
private JobType myJobType; 
... 
builderSource.select(new JobBindingQualifier(myJobType).get(); 

JobBindingQualifier 사용자 정의 클래스 이들은 관련 JOBTYPE 주어진 JobBinding 주석 주석된다 지금까지 대단한 - CDI는 훌륭하게 작동했습니다. 그러나 JOB_X와 JOB_Y 작업 중 2 개 작업이 정확히 동일한 방식으로 구축되면 어떻게됩니까? 하나의 빌더 클래스 만 필요합니다. 이러한 옵션 중 하나 (new JobBindingQualifier(JobType.JOB_X) 또는 new JobBindingQualifier(JobType.JOB_Y))에 대해 인스턴스화하고 싶습니다.

JobXAndYBuilder@JobBinding(JOB_X)@JobBinding(JOB_Y)으로 주석을 추가하면 중복 된 주석에 대한 컴파일러 오류가 발생합니다. 이 해결하기 위해 나는 JobTypes의 배열에 주석의 값을 변경할 수 있으며, 당신은 배열을 생산하기 위해 생략 부호를 사용하여이라는 생성자를

@JobBinding(JobType.JOB_X, JobType.JOB_Y) 

같은 빌더에 주석을 것이다. 그러나, 내가 그랬다면, 어쨌든 중 하나를 사용하여 프로그래밍 방식으로이를 볼 수 있습니까?? 용접 문서에 따르면 모두; 나도 클래스 조회하기에 충분 할 때

builderSource.select(new JobBindingQualifier(JobType.JOB_X, JobType.JOB_Y).get(); 

가 : 배열을 사용

builderSource.select(new JobBindingQualifier(JobType.JOB_X).get(); 
//or 
builderSource.select(new JobBindingQualifier(JobType.JOB_Y).get(); 

정말 당신이 때 일치 할 필요가 값을 변경 나는 정확한 인수를 제공해야 할 것 찾고. 동일한 한정자 주석을 사용하여 클래스에 두 번 주석을 추가하는 방법이 필요합니다. 그런 다음 이들의 조합을 사용하여 조회 할 수 있습니다. 그렇지 않으면 X와 Y 각각에 대해 빌더 클래스를 제공해야합니다. 어떤 아이디어? 미리 감사드립니다!

+0

jobTypes 중 하나를 조회하려면 올바른 방법이 아닙니다. 빈에 2 개의 한정어를 넣는 것은 OR가 아닌 AND 자격입니다. 이 문제가 아직 보류 중입니까? 나는 해결책이 있다고 생각하고 아직도 그것을 필요로한다면 그것을 적어 두는 데 시간이 걸릴 것입니다. –

+0

예하시기 바랍니다! 대단히 유효합니다! –

+0

죄송합니다. 스택 오버플로가 메일 알림 개념을 찾지 못했던 것 같습니다. 내 대답은 아래 –

답변

2

제 의견에는 콩 클래스에 두 개 이상의 한정자가있을 때 OR 관계를 갖는 방법이 없다고 말했습니다.

따라서 다른 한정자와 동일한 Bean을 갖는 솔루션은 Producer 메커니즘을 사용하는 것입니다.

@JobBinding(JobType.JOB_X) 
public class JobABuilder implements JobBuilder { 
    .... 
} 

을하고 그 이후에 중 첫 번째 클래스 또는 PARAMATERS에서 그

public class MoreJobsProducer { 
    @Produces 
    @JobBinding(JobType.JOB_Y) 
    protected JobBuilder prodJobYBuilder(@New @JobBinding(JobType.JOB_X) 
             JobBuilder theJob) { 
     return theJob; 
    }  
} 

같은 전용 생산자 클래스의 생산자 방식을 만들 : 귀하의 예제에서 당신은 평소처럼 당신에게 첫 번째 클래스를 만들 수 있습니다 생산자 메소드의 경우 자신의 한정자와 함께 이전 bean을 삽입하고 어떤 범위 지정 문제를 피하기 위해 Bean의 새로운 인스턴스를 생성하는 @New 한정자 (자세한 정보는 Weld 문서를 읽으십시오).

"작업"을 수행해야합니다.

+0

아 - 고마워요 앙투안, 교활한! 좋은 생각이야. '@Inject @JobBinding (JobTYpe.JOB_Y) JobBuilder myYJobBuilder;'를 실행했지만'builderSource.select (new JobBindingQualifier (JobType.JOB_Y) .get()에 대해 잘 모르겠다. ; - 인스턴스 물건도 프로듀서를 사용합니까, 아니면 여전히 실제 주석이 달린 클래스를 기대합니까? ... 어쨌든 - 감사합니다. –

+0

나는 작동합니다. Seam Social에서 사용하여 두 가지 방법으로 Twitter 서비스 및 관련 설정을 주입 할 수 있습니다. –