【问题标题】:JSF custom component: support for arguments of custom types, the attribute setter is never invokedJSF 自定义组件:支持自定义类型的参数,永远不会调用属性设置器
【发布时间】:2012-11-09 14:50:13
【问题描述】:

我根据许多教程之一创建了我的自定义 JSF 组件(我正在使用 PrimeFaces),我添加了一个已成功传递给组件。

<c:custom command="command"/>
public void setCommand(String command) {
    log.debug("setCommand {}", command);
    this.command = command;
}

但我需要自定义类型的参数,这是我在教程中找不到的东西,教程只处理最琐碎的情况。

<c:custom image="#{currentImageBean.image}"/>
public void setImage(Object image) {
    log.debug("setImage {}", image);
    this.image = (Image) image;
}

bean 正在返回 Image 类型的对象,但未调用 setter。我预计这会起作用,因为否则一个好的教程应该提到这种情况,但现在我被更糟糕的错误所困扰:没有任何反应,日志中也没有任何内容表明原因......所以,出了什么问题,我需要改变什么,在哪里寻找潜在的错误?

【问题讨论】:

    标签: java jsf jsf-2 attributes custom-component


    【解决方案1】:

    这与自定义类型无关。这与在attributename="attributevalue"attributename="#{attribute.value}" 中使用文字(静态)值与EL 有关。

    这种行为是预期的,并且符合规范。 EL 表达式 (ValueExpressions) 的属性值由UIComponent#setValueExpression() 设置。它们应该只在真正被请求时才被评估,通常是在视图渲染期间。在烘焙UIComponent 实例期间不应直接评估它们,因为这会破坏动态值表达式的性质(考虑取决于当前数据表的迭代轮次)。

    更好的方法是将可以保存 EL 值表达式的属性的 getter/setter 委托给 UIComponent#getStateHelper() 而不是本地属性。 setValueExpression() 最终也会出现在 StateHelper 中。 UIComponent#getAttributes() 还解析来自 StateHelper 的值。

    public Image getImage() {
       return (Image) getStateHelper().eval("image");
    }
    
    public void setImage(Image image) {
        getStateHelper().put("image", image);
    }
    

    请注意,没有本地属性。因此,当您需要属性的(评估)值时,只需调用 getter。

    为了实现您的初始功能要求,即设置属性的日志记录,您可能希望将日志记录语句添加到委托给supersetValueExpression() 覆盖。

    @Override
    public void setValueExpression(String name, ValueExpression binding) {
        log.debug(....);
        super.setValueExpression(name, binding);
    }
    

    【讨论】:

    • 谢谢,我在 getAttributes.get("image"); 下有这个对象;
    • 不客气。没错,getAttributes() 也提供了答案。然而,我强烈建议更改 getter/setter,然后直接使用它们。这也是 JSF 实现和组件库构建其组件的方式。
    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 2011-07-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多