当JSF表单字段连接到实体bean字段(映射到DB字段)时,无论用户是否更改了前端的表单字段值,即实体bean中的每个setter都被调用,即未更改字段上的setter与已更改的字段相同,但它们的新值与旧值相同。
我的问题很简单:有没有办法配置JSF
只调用映射到前端已更改字段的setter?这样做的原因是我有一个要求,我必须检测每个持久性的增量并记录它们,更多关于哪些可以在this question中读取。
答案 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
标签实施,但这不是您示例的最佳选择(您可以在下面的部分中找到一些示例,以防万一)