JSF复合组件method-signature含<字符报错,求正确声明方案
JSF复合组件method-signature报错及相关问题
报错信息
与元素类型“cc:attribute”关联的“method-signature”属性值不得包含'<'字符。
javax.faces.view.facelets.FaceletException: 解析/resources/custom.xhtml出错: 错误追踪[行: 6]
涉及代码
<f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:composite="http://java.sun.com/jsf/composite" xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core"> <composite:interface> <composite:attribute method-signature="List<String> function(String param)" name="function"/> </composite:interface> <composite:implementation> <p:ajax event="change" update="#{cc.attrs.function}"/> </composite:implementation> </f:view>
问题
- 复合组件属性的method-signature正确声明方式是什么?
- JSF中MethodExpression的正确语法是什么?
- EL是否支持泛型方法?
- 应当使用
<和>转义尖括号,还是移除泛型让EL正确解析List function(String param)?
解答
复合组件method-signature正确声明:XML属性值不允许直接使用
<和>,有两种合规写法:- 对尖括号进行XML转义:
<composite:attribute method-signature="List<String> function(String param)" name="function"/> - 移除泛型类型声明:
<composite:attribute method-signature="List function(String param)" name="function"/>
- 对尖括号进行XML转义:
JSF MethodExpression正确语法:遵循EL规范,只需指定方法的返回类型和参数类型,无需显式泛型。比如后端方法为
public List<String> someMethod(String param),对应的EL表达式写为#{bean.someMethod(param)}即可,EL会自动匹配方法签名。EL对泛型方法的支持:EL不处理泛型类型信息,因为Java泛型编译后会被类型擦除,运行时EL仅依据方法的原始类型(如
List而非List<String>)进行匹配。因此EL可以调用泛型方法,但只关心方法的参数和返回值的原始类型是否匹配。转义vs移除泛型的选择:两种方式都可行,推荐移除泛型。原因是泛型在运行时会被擦除,JSF对method-signature的校验仅关注原始类型,移除泛型后代码更简洁,也避免了XML转义的繁琐;若一定要保留泛型声明,则必须使用
<和>进行转义,否则会触发XML解析错误。
内容的提问来源于stack exchange,提问作者camilajenny
相关产品推荐
相关产品推荐

