gpt4 book ai didi

jsf - 自定义组件上的 ValueChangeListener 导致 PropertyNotFoundException

转载 作者:行者123 更新时间:2023-12-04 23:57:33 26 4
gpt4 key购买 nike

我们有一个自定义的 JSF 组件,它以特定方式呈现一些按钮和一个选择框。这是由扩展 UIInput 的类完成的。 xhtml 模板中使用的自定义组件如下所示:

<xx:fooComponent
value="#{fooBean.someProperty}"
valueChangeListener="#{fooBean.someMethodInBean}"
someOtherProperties="true" />

现在,由于我们从运行 JSF 2.0 的 JBoss 4.2.2 更改为使用内置 JSF 库运行的 JBoss 7.1.1,它会提示 someMethodInBean 不是一个属性。当然它不是一个属性,它是一个方法。世界上有谁会将属性绑定(bind)到 valueChangeListener

起初我认为,这与方法位于引用 bean 的父类(super class)中有关,但事实并非如此。将此特定方法添加到 FooBean 没有任何区别。

所以我的问题是,他们做了什么更改以致现在出现问题,我该如何以一种有利于迁移的方式修复它?

编辑

组件在我们的 *.taglib.xml 中这样声明:

<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd">

<!-- ... -->
<tag>
<tag-name>fooComponent</tag-name>
<component>
<component-type>myProject.FooComponent</component-type>
</component>
</tag>

... 这导致了 faces-config.xml 中的声明:

<component>
<component-type>myProject.FooComponent</component-type>
<component-class>com.myproject.somemore.UIFooComponent</component-class>
</component>

... 导致类 UIFooComponent extends UIInput

编辑2

现在 taglib xml 看起来像这样:

<facelet-taglib version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd">

<tag>
<tag-name>fooComponent</tag-name>
<component>
<component-type>myProject.FooComponent</component-type>
</component>
<attribute>
<name>valueChangeListener</name>
<method-signature>void valueChanged(javax.faces.event.ValueChangeEvent)</method-signature>
</attribute>
</tag>
</facelet-taglib>

仍然,他提示 fooBean 没有属性 someMethodInBean

编辑 3

堆栈跟踪是:

Caused by: javax.el.ELException: /abc/abc.xhtml: The class 'com.myproject.managedbeans.foo.FooBean' does not have the property 'someMethodInBean'.
at com.sun.faces.facelets.compiler.AttributeInstruction.write(AttributeInstruction.java:94)
at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:302)
at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
at org.apache.myfaces.tomahawk.application.ResourceViewHandlerWrapper.renderView(ResourceViewHandlerWrapper.java:93)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
... 21 more

最佳答案

这表示标记属性未声明为 <method-signature>在组件的 <tag> .taglib.xml中的声明文件如下:

<attribute>
<name>valueChangeListener</name>
<method-signature>void valueChange(javax.faces.event.ValueChangeEvent)</method-signature>
</attribute>

确保已按上述方式正确声明。


更新:您需要确保已声明 .taglib.xml文件符合 JSF 2.x Facelets XSD(因此不是传统 Facelets 1.x 中的 DTD)。

<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0"
>

<!-- Tags here -->

</facelet-taglib>

关于jsf - 自定义组件上的 ValueChangeListener 导致 PropertyNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11050846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com