重新加载bean属性
问题描述:
比方说,我有一个JSF页面,在顶部有一个共同的下拉菜单(标题)和一个用于向此菜单添加新值的窗体。而且我在表单中有一个绝对正确的属性“更新”'ajax'标签(我的意思是,提交表单后更新页面上的下拉菜单)。重点在于下拉菜单和添加值表单具有不同的视图类。重新加载bean属性
第一招:
二@Named
@ViewScoped
public class DropdownMenuView {
@Inject
private ValuesService service;
private List<String> values;
@PostConstruct
public void init() {
value = service.getValues();
}
// Getters Setters...
}
之一:
@Named
@ViewScoped
public class NewValuesView {
@Inject
private ValuesService service;
public void addValue(String newValue) {
service.addValue(newValue);
}
}
好吧,现在我通过添加新形式的价值,并打开下拉列表。但是这个列表并没有真正更新,因为DropdownMenuView上的'values'列表仍然是一样的。
我的问题是,如何在提交表单后更新'值'?有没有注入DropdowneMenuView到NewValuesView并手动更新它的方法?
我现在看到的唯一方法是实现类似“events class”的事情,在值更新后触发一个事件并在getter中检查这个类。
事件holer虚拟实现:
public class EventHolder {
private static boolean event;
public static void fire() {
event = true;
}
public static boolean poll() {
boolean res = event;
event = false;
return res;
}
}
而且第2页:
public class NewValuesView {
@Inject
private ValuesService service;
public void addValue(String newValue) {
service.addValue(newValue);
EventHolder.fire();
}
}
和页面:
public class DropdownListView {
...
public List<String> getValues() {
if (EventHolder.poll()) {
values = service.getValues();
}
return values;
}
}
但我知道,放逻辑getter/setter方法是不好的方法。
那么,有什么建议?
谢谢。
答
也许,这是因为@Inject标注的默认范围是依赖伪范围@Dependent
CDI采用了所谓的依赖伪范围。这是没有显式声明范围类型的bean的默认范围。 [...]从属bean的实例永远不会在不同的客户端或不同的注入点之间共享。它完全是一些其他对象的依赖对象。当它所属的对象被创建时被实例化,并且当它所属的对象被销毁时被销毁。
所以,当你宣布你的服务ValuesService尝试使用一个正常的范围内(http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#dependentcontext)