通过带参数表的注释选择CDI bean

时间:2018-06-25 16:00:07

标签: java java-ee cdi

如何基于注解选择CDI java bean,然后注解构成参数表?

使用示例比描述问题更容易显示问题。

假设对于每个问题类型的对象,我们必须选择适当的解决方案。

Decrypt(passphrase, salt, [iv,] hmac, ciphertext) => data

问题类型很少:

public class Problem {

    private Object data;
    private ProblemType type;

    public Object getData() { return data; }
    public void setData(Object data) { this.data = data; }
    public ProblemType getType() { return type; }
    public void setType(ProblemType type) { this.type = type;}
}

解决方案很少:

public enum ProblemType {
    A, B, C;
}

喜欢 FirstSolution

public interface Solution {
    public void resolve(Problem problem);
}

SecondSolution

@RequestScoped
@SolutionQualifier(problemTypes = { ProblemType.A, ProblemType.C })
public class FirstSolution implements Solution {

    @Override
    public void resolve(Problem problem) {
        // ...
    }
}

应根据注释 @SolutionQualifier 选择解决方案:

@RequestScoped
@SolutionQualifier(problemTypes = { ProblemType.B })
public class SecondSolution implements Solution {

    @Override
    public void resolve(Problem problem) {
        // ...
    }
}

通过 SolutionProvider

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface SolutionQualifier {

    ProblemType[] problemTypes();

    public static class SolutionQualifierLiteral extends AnnotationLiteral<SolutionQualifier> implements SolutionQualifier {

        private ProblemType[] problemTypes;

        public SolutionQualifierLiteral(ProblemType[] problems) {
            this.problemTypes = problems;
        }

        @Override
        public ProblemType[] problemTypes() {
            return problemTypes;
        }
    }
}

在最后一个问题中: 我不知道方法 javax.enterprise.inject.Instance#select(Annotation ...)在内部如何工作,以及它如何比较注释,所以我不知道我应该放在那里获取什么参数适当的解决方案。如果出现类型为 A 的问题,表 ProblemType [] 将包含一个参数,而 FirstSolution.class @注释SolutionQualifier 具有两个参数,因此我将无法获得适当的实例。

1 个答案:

答案 0 :(得分:1)

我没有找到使用CDI API来解决它的方法,

我创建了另一个枚举:

public enum SoultionType {
    A(ProblemType.A, ProblemType.C), 
    B(ProblemType.A);

    //...

    SoultionType(ProblemType problems...) {
        // ...
    }

    public static SoultionType getByProblemType(ProblemType problem) {
        // ...
    }
}

已更改,因此SolutionQualifier内部仅具有SoultionType字段,因此比较没有问题。