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 각각에 대해 빌더 클래스를 제공해야합니다. 어떤 아이디어? 미리 감사드립니다!
jobTypes 중 하나를 조회하려면 올바른 방법이 아닙니다. 빈에 2 개의 한정어를 넣는 것은 OR가 아닌 AND 자격입니다. 이 문제가 아직 보류 중입니까? 나는 해결책이 있다고 생각하고 아직도 그것을 필요로한다면 그것을 적어 두는 데 시간이 걸릴 것입니다. –
예하시기 바랍니다! 대단히 유효합니다! –
죄송합니다. 스택 오버플로가 메일 알림 개념을 찾지 못했던 것 같습니다. 내 대답은 아래 –