You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

问题

  1. 复合组件属性的method-signature正确声明方式是什么?
  2. JSF中MethodExpression的正确语法是什么?
  3. EL是否支持泛型方法?
  4. 应当使用&lt;和&gt;转义尖括号,还是移除泛型让EL正确解析List function(String param)?

解答

  1. 复合组件method-signature正确声明:XML属性值不允许直接使用<和>,有两种合规写法:

    • 对尖括号进行XML转义:
      <composite:attribute method-signature="List&lt;String&gt; function(String param)" name="function"/>
      
    • 移除泛型类型声明:
      <composite:attribute method-signature="List function(String param)" name="function"/>
      
  2. JSF MethodExpression正确语法:遵循EL规范,只需指定方法的返回类型和参数类型,无需显式泛型。比如后端方法为public List<String> someMethod(String param),对应的EL表达式写为#{bean.someMethod(param)}即可,EL会自动匹配方法签名。

  3. EL对泛型方法的支持:EL不处理泛型类型信息,因为Java泛型编译后会被类型擦除,运行时EL仅依据方法的原始类型(如List而非List<String>)进行匹配。因此EL可以调用泛型方法,但只关心方法的参数和返回值的原始类型是否匹配。

  4. 转义vs移除泛型的选择:两种方式都可行,推荐移除泛型。原因是泛型在运行时会被擦除,JSF对method-signature的校验仅关注原始类型,移除泛型后代码更简洁,也避免了XML转义的繁琐;若一定要保留泛型声明,则必须使用&lt;和&gt;进行转义,否则会触发XML解析错误。

内容的提问来源于stack exchange,提问作者camilajenny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:35:21