Lou*_*ise 5 jsf annotations faces-config systemeventlistener
我正在尝试创建一个自定义SystemEventListener类型UIInput,用于注册所有类型的实例并对它们的postValidate-Events做出反应。根据我在网上找到的一个例子,我设法HtmlInputText通过faces-config.xml如下注册它来运行它:
<system-event-listener>
<source-class>javax.faces.component.html.HtmlInputText</source-class>
<system-event-class>javax.faces.event.PostValidateEvent</system-event-class>
<system-event-listener-class>com.ourcompany.ourproduct.validators.inputPostValidationListener</system-event-listener-class>
</system-event-listener>
Run Code Online (Sandbox Code Playgroud)
然后我尝试 1) 将其扩展到一般的 UIInputs 和 2) 使用 @ListenerFor注释,但我似乎无法让其中任何一个工作。
对于 1) 我真的找不到任何示例或文档,所以我只是尝试了 a) 定义多个源类标签或 b) 使用 javax.faces.component.UIInput作为源类。都没有工作。
2)我试过
@ListenerFor(systemEventClass = PostValidateEvent.class, sourceClass = UIInput.class)
Run Code Online (Sandbox Code Playgroud)
它既不适用于 UIInput,也不适用于 html.HtmlInputText。
现在,当我为所有其他类型的 HTML 输入复制相同的 XML 配置时,这确实有效,但它只会使 xml 变得混乱,而且对我来说似乎很烦人。
所以问题是:我通常在@ListenerFor 注释上做错了什么吗?对哪些源类可能有限制,即为什么我不能使用更通用的 UIInput?有没有比重复 XML 更有效的方法来为所有这些不同的输入注册监听器?最后:我宁愿实现ComponentSystemEventListener. 假设上述问题已解决,我只需更改implements-Statement 并相应地实现抽象processEvent,对吗?在这种情况下,这会起作用还是注册/ xml-config 不同(例如,也许<component-system-event-listener>而不仅仅是<system-event-listener>?
(以及作为后记:是只有我还是很难在网络上找到此类内容的任何非平凡示例?)
应该在或实现@ListenerFor上设置,而不是在独立实现上设置。另请参阅javadoc(重点是我的):UIComponentRendererSystemEventListener
默认实现必须支持将此注释附加到
UIComponent或Renderer类。在这两种情况下,本文描述的注释处理必须在 的任何变体的实现期间开始,并且必须在从 实例返回Application.createComponent()之前完成。注释处理必须按照语义上等价的算法进行。UIComponentcreateComponent()...
为了拥有一个全局侦听器,而不是特定于UIComponent或Renderer,您最好的选择是创建并注册PhaseListener,它将侦听器订阅到视图根。
public class PostValidateListener implements PhaseListener {
@Override
public PhaseId getPhaseId() {
return PhaseId.PROCESS_VALIDATIONS;
}
@Override
public void beforePhase(PhaseEvent event) {
event.getFacesContext().getViewRoot()
.subscribeToViewEvent(PostValidateEvent.class, new InputPostValidationListener()); // Capitalize class name?
}
@Override
public void afterPhase(PhaseEvent event) {
// NOOP.
}
}
Run Code Online (Sandbox Code Playgroud)
要使其运行,请在 faces-config.xml 中按如下方式注册:
<lifecycle>
<phase-listener>com.example.PostValidateListener</phase-listener>
</lifecycle>
Run Code Online (Sandbox Code Playgroud)
您甚至可以使自己InputPostValidationListener成为PhaseListener.
public class InputPostValidationListener implements PhaseListener, SystemEventListener {
@Override
public void beforePhase(PhaseEvent event) {
event.getFacesContext().getViewRoot().subscribeToViewEvent(PostValidateEvent.class, this);
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4025 次 |
| 最近记录: |