【发布时间】:2018-11-29 13:13:25
【问题描述】:
我想注入一个 bean 列表。我在网上搜索,但发现不是很多。我试过这个:https://onlysoftware.wordpress.com/2011/07/10/injecting-lists-cdi-jsf/ 但是用豆子。
查看:
@UIScoped
public class DemoView extends VerticalLayout {
@Inject
private MessageBean messageBean;
private Button button;
public DemoView() {
getStyle().set("border", "1px solid");
button = new Button("Click me", event -> Notification.show(messageBean.getMessage()));
}
public void init() {
removeAll();
add(new Label("oh no!"));
add(button);
}
}
注释:
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier
public @interface ViewList {
}
InitBean:
@ApplicationScoped
public class AppInitBean implements Serializable {
@Produces
@Named(value = "viewNamedList")
@ViewList
public List<DemoView> getViews() {
return this.generateViews();
}
private List<DemoView> generateViews() {
List<DemoView> views = new ArrayList<DemoView>(5);
for (int i = 1; i <= 5; i++) {
DemoView emp = new DemoView();
views.add(emp);
}
return views;
}
}
主类:
@Route("")
public class MainView extends VerticalLayout implements BeforeEnterObserver {
@Inject
@ViewList
private List<DemoView> viewList;
@Override
public void beforeEnter(BeforeEnterEvent event) {
removeAll();
add(new Label("whatever"));
for (DemoView demoView : viewList) {
demoView.init();
add(demoView);
}
}
}
列表已生成并将按预期显示。但是如果我按下按钮,我会得到一个 NPE -> messageBean 没有注入。
所以我的问题是:甚至可以注入 bean 列表吗? 我想如果这是可能的,也应该可以在列表中添加一个元素。而是一步一个脚印。
【问题讨论】:
标签: jakarta-ee cdi