具有动态属性的对象的添加/编辑操作

时间:2012-05-14 14:56:15

标签: java jsf primefaces crud managed-bean

我需要帮助来实现CRUD操作。我的应用程序包含一个对象表。每个对象由属性列表(值)描述。使用自定义JSF编辑器修改一个属性,具体取决于属性类型。

当用户添加新帐户时,编辑者列表将根据对象的类型确定,并使用custom:include标记显示在表单中。此自定义标记用于动态包含编辑器<custom:include src="#{editor.component}">。 component属性指向JSF编辑器的位置。

每个编辑器都有一个托管bean,它实现了ValueHolder接口并继承了AbstractEditor类。 AbstractEditor包含 updateEditor 方法。

public interface ValueHolder {  
    String EDITOR_VALUES = "editorValues";  
    public Object getValue();  
} 

我使用会话映射,编辑器名称为键,编辑器值为值。当用户修改属性时,将调用updateEditor方法并使用编辑器的新值更新映射。

问题在于编辑器背后的bean的范围。如果我使用@SessionScoped bean,初始化编辑器的代码不会再次调用,我无法处理添加/编辑操作。 @SessionScoped仅适用于添加。我已经尝试过使用@RequestScoped,但这些bean经常被调用,我不知道这是不是很好。

我正在使用JSF2,PrimeFaces 3.0.M4和Spring Web Flow进行导航。

2 个答案:

答案 0 :(得分:1)

你看过使用@ViewScoped豆子了吗?只要您继续返回到同一页面,视图范围的bean就会保留在范围内。这看起来就像你在做什么。

或者,如果您使用CDI,则可以使用@ConversationScoped在执行更新时将bean保留在范围内。这有一个明确的开始和结束。这将允许您确定bean何时超出范围。

答案 1 :(得分:0)

我保留了@SessionScoped豆子。 bean的名称存储在会话中,它与编辑器的文件名相同。这样编辑器和bean之间就存在关联。

initialize 方法已添加到ValueHolder界面。添加/修改对象时会调用此方法。