JSF应用程序的审计跟踪 - 全局valueChangeListener可能吗?

时间:2011-09-19 15:12:29

标签: jsf jpa jsf-2 audit-trail

我正在尝试为我的Web应用程序实现记录的审计跟踪功能:

  • lastModified(timestamp)
  • modifiedBy(用户信息)
  • userComment(价值变动的原因)

对于我的每个输入字段(输入字段分布在具有不同支持bean和不同valueHolder类的多个表单上)。

前两个(lastModified和modifiedBy)可以在JPA AuditListener和@PrePersit和@PreUpdate方法的帮助下轻松完成。

第三个有点棘手,因为它需要用户交互。最好是一个要求用户评论的对话框。

所以(至少)有两个未解决的问题:我可以为我的应用程序中的所有输入字段建立一个“全局”valueChangeListener吗?如果没有将<f:valueChangeListener>附加到每个输入组件,这是否可行?第二:我如何获取用户评论。我的想法是在我的网页模板中放置一个p:dialog,但是这个对话框需要知道它被调用的输入组件。

1 个答案:

答案 0 :(得分:4)

  

我可以为我的应用程序中的所有输入字段建立一个“全局”valueChangeListener吗?如果没有附加到每个输入组件,这是否可行?

是的,SystemEventListener期间会执行PreRenderViewEvent。您需要遍历FacesContext#getViewRoot()获取的组件树,以查找instanceof EditableValueHolder(或更精细的内容)的所有组件,然后添加new YourValueChangeListener()通过addValueChangeListener()方法。另请参阅此答案如何注册系统事件侦听器:How to apply a JSF2 phaselistener after viewroot gets built?


  

第二:我如何获取用户评论。我的想法是在我的网页模板中放置一个p:对话框,但是这个对话框需要知道它被调用的输入组件。

您可以在YourValueChangeListener#processValueChange()中将有问题的组件设置为某个请求的属性,或者按evaluateExpressionGet()抓取的范围。

Recorder recorder = (Recorder) context.getApplication().evaluateExpressionGet(context, "#{recorder}", Recorder.class);
recorder.setComponent(event.getComponent());
// ...

如果需要,它将执行EL并在其范围内自动创建bean。反过来,bean还应该包含表示用户注释的属性。最后,您可以在<p:dialog>

中使用它
<p>You have edited #{recorder.component.label}, please mention the reason:</p>
...
<h:inputText value="#{recorder.comment}" />