重新加载bean属性

时间:2017-09-24 11:42:46

标签: jsf master-detail session-scope

让我们说,我的JSF页面顶部有常见的下拉菜单(标题),还有一个用于向此菜单添加新值的表单。我在表单中有一个绝对正确的'ajax'标签属性'更新'(我的意思是,提交表单后页面上的下拉菜单会更新)。关键是下拉菜单和添加值的表单具有不同的视图类。

第一个:

@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上的“值”列表仍然相同。

我的问题是,如何在提交表单后更新“值”?有没有办法没有将DropdowneMenuView注入NewValuesView并手动更新它?

我现在看到的唯一方法是实现类似“事件类”的东西,在值更新后触发事件并在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();
    }
}

第1页:

public class DropdownListView {

    ...

    public List<String> getValues() {
        if (EventHolder.poll()) {
            values = service.getValues();
        }
        return values;
    }
}

但是我知道把吸气剂/安装者的逻辑放在一个坏方法 那么,有什么建议吗? 谢谢。

1 个答案:

答案 0 :(得分:0)

或许,这是因为 @Inject 注释的默认范围是从属伪范围 @Dependent

  

CDI具有所谓的依赖伪范围。这是未明确声明范围类型的bean的默认范围。 [...]从不在不同客户端或不同注入点之间共享依赖bean的实例。它严格来说是某个其他对象的依赖对象。它在创建它所属的对象时被实例化,并在它所属的对象被销毁时被销毁。

因此,当您声明服务 ValuesService 时,请尝试使用正常范围(http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#dependentcontext