可以将JSF配置为不调用实体设置器,除非该字段实际更改了吗?

时间:2015-02-25 21:46:13

标签: jsf logging getter-setter

当JSF表单字段连接到实体bean字段(映射到DB字段)时,无论用户是否更改了前端的表单字段值,即实体bean中的每个setter都被调用,即未更改字段上的setter与已更改的字段相同,但它们的新值与旧值相同。

我的问题很简单:有没有办法配置JSF只调用映射到前端已更改字段的setter?这样做的原因是我有一个要求,我必须检测每个持久性的增量并记录它们,更多关于哪些可以在this question中读取。

1 个答案:

答案 0 :(得分:3)

也许我没有清楚地理解你,但为什么你直接将你的实体bean映射到JSF视图?恕我直言,如果你在JSF页面和实体之间添加托管bean会更好,以便更好地将业务逻辑与数据访问分开。

任何方式,我认为针对该案例的最简单的解决方案是使用Value Change Events来调用" 通常"在Process Validations phase之后(除非您使用immediate属性)。

关于价值变更事件(关于您的示例)的好消息是,在您使用JavaScript或命令组件强制表单提交 AND 后,它们被调用 strong>新值与旧值不同。

因此,作为如何使用值更改侦听器的示例,您可以为每个JSF标记添加valueChangeListner属性,如下所示:

<h:inputText id="input" value="#{someBean.someValue}" 
   valueChangeListener="#{someBean.valueChanged} />

然后,实施您的valueChanged()方法,如下所示:

public void valueChanged(ValueChangeEvent event) {         

   // You can use event.getOldValue() and event.getNewValue() to get the old or the new value

}

使用上述实现,可以帮助您从托管属性设置器中分离您的日志记录代码(它将包含在侦听器中)。

NB:价值变化听众也可能使用f:valueChangeListener标签实施,但这不是您示例的最佳选择(您可以在下面的部分中找到一些示例,以防万一)

另见: