动态 cdi 与 @Any

问题描述 投票:0回答:1

在我们的 Java EE 应用程序中,我们处理不同的文件类型。但不是将所有类型注入为

@Any
@Inject
private Instance<FileHandler> handler

我们用一个大开关来做到这一点。所有处理程序都从 FileHandler 扩展,它是一个抽象类,而不是一个接口。有没有办法让它通用?从我所看到的 Instance 来看,您仍然必须传递您想要使用的实现的类文件。

@Inject
private XmlHandler xmlHandler;

@Inject
private CsvHandler csvHandler;


public void method(String fileType) {
    switch (fileType) {
        case "xml":
            xmlHandler.handle();
            break;
        case "csv":
            csvHandler.handle();
            break;
    }
}
java jakarta-ee cdi
1个回答
0
投票

枚举列出所有这些:

public enum FileHandlers {
    XmlHandler,
    CsvHandler
}

要指定的限定符:

@Target({ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier 
public @interface FileHandlerChooser {
FileHandlers choose();
}

实施:

@FileHandlerChooser(choose = FileHandlers.XmlHandler)
public class XmlHandler implements FileHandler {

...

}

注射:

@Inject
@FileHandlerChooser(choose = FileHandlers.XmlHandler)
private FileHandler fileHandler;
© www.soinside.com 2019 - 2024. All rights reserved.