【问题标题】:Can JSF be configured to not invoke Entity setter unless the field actually changed?除非字段实际更改,否则 JSF 是否可以配置为不调用实体设置器?
【发布时间】:2015-02-25 21:46:13
【问题描述】:

当一个 JSF 表单域被连接到一个实体 bean 域(映射到一个 DB 域)时,实体 bean 中的每个 setter 都会被调用,而不管用户是否在前端改变了表单域的值,即未更改字段的 setter 与已更改字段的调用相同,但其新值与旧值相同。

我的问题很简单:有没有办法将JSF 配置为仅调用映射到前端已更改字段的设置器?这样做的原因是我有一个要求,我必须检测每个持久化上的增量并记录它们,更多信息可以在this question 中阅读。

【问题讨论】:

  • 如果 jsf 那样做呢?您将如何检测该字段是否(未)更改并记录该字段?我在 Internet/stackoverflow 上搜索了几种解决方案,并找到了一些与您的其他帖子相关的链接。所以我认为其他帖子仍然比这个问题更相关
  • 如果 JSF 这样做了,我可以修改每个 setter 以将该字段添加到更改的字段集中,而无需检查新 val 是否与旧 val 不同。
  • 当然,对于另一个问题,无需进行单独的现场检查的优雅解决方案将是更可取的。这只是 B 计划
  • 如果您创建一个基本实体并在其中完成所有工作,那么将其添加到一组更改的字段或检测到更改是一个很小的区别。它只是在 setter 中添加一个调用。我个人会以不同的方式处理它,但会在您的其他帖子中回复

标签: jsf logging getter-setter


【解决方案1】:

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

无论如何,我认为在这种情况下最简单的 impelement 解决方案是使用 Value Change EventsProcess Validations phase 之后调用“通常”(除非你使用 @ 987654327@ 属性)。

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

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

<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

}

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

注意: 值更改侦听器也可以使用 f:valueChangeListener 标记来实现,但这不是您示例的最佳选择(您可以在下面的部分中找到一些示例,就在案例)

另见:

【讨论】:

  • 它是一种迭代形式,这意味着它包含的相同形式的迭代与数据库中与视图对应的行数一样多。托管 bean 返回一个实体数组,因此每个表单迭代都映射到该数组。您的答案假定它是单数形式,而事实并非如此。想象一下,如果表格代表你所有的孩子,你可以有 0-X 个孩子,如果你有 3 个,就会有一个由 3 个表格组成的数据网格,每个表格看起来都一样,除了里面的值。所以每个表单中的每个字段都映射到entity.someField
  • @amphibient 然后,如果您的日志记录代码相同,您将只在托管 bean 中使用一个侦听器方法,例如 public void valueChanged(ValueChangeEvent event) 并在您的输入字段中添加属性 valueChangeListener="#{yourManagedBean.valueChanged}无论您有多少表单,它都只是一个属性,将添加到您要跟踪的每个输入中。希望,我明白你的意思,如果你看到我与你要找的东西相去甚远,请提供一些代码,以便我更好地理解我误解了什么:)
  • if 声明是不必要的(如您的第 3 段所述)。
  • @BalusC 行动!!我说除非旧值和新值不同,否则监听器不会执行,然后我添加了那个不必要的语句!感谢您的通知:) 我更新了
猜你喜欢
  • 2012-07-23
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2021-01-15
  • 2021-01-31
  • 1970-01-01
相关资源
最近更新 更多