为啥 UIComponent.setStyleClass() 在 JSF 2.1 转换器中不起作用?

Posted

技术标签:

【中文标题】为啥 UIComponent.setStyleClass() 在 JSF 2.1 转换器中不起作用?【英文标题】:Why is UIComponent.setStyleClass() not working in JSF 2.1 converters?为什么 UIComponent.setStyleClass() 在 JSF 2.1 转换器中不起作用? 【发布时间】:2014-06-12 07:30:39 【问题描述】:

如果我在 JSF 转换器 getAsString(...) 方法中的 UIComponent 引用上调用 setStyleClass,则不会应用所述类。

如果我在绑定组件(使用“绑定”)上的支持 bean 中执行相同操作,它会按预期工作。

转换器被调用,它已正确注册。

这是我的转换器:

@FacesConverter(forClass = MoneyAmount.class)
public class MoneyAmountConverter implements Converter 
    Logger log = LoggerFactory.getLogger(getClass());

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) 
        return null;        
    

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) 
        MoneyAmount amount = (MoneyAmount) value;

        StringBuilder sb = new StringBuilder();
        sb.append(amount.getCurrency());
        sb.append(" ");
        sb.append(amount.getAmount());

        if( component instanceof htmlOutputLabel ) 
            HtmlOutputLabel lbl = (HtmlOutputLabel) component;
            log.info("isOutputLabel for: ", sb.toString());
            if( amount.isNegative() ) 
                log.info("setting style to red");
                lbl.setStyleClass("red");
             else 
                log.info("setting style to blue");
                lbl.setStyleClass("blue");
                        
        

        return sb.toString();
       

谢谢你的期待!

【问题讨论】:

【参考方案1】:

您是否调试过这段代码?通过查看代码,我猜问题是您可能不会在 HtmlOutputLabel 组件上安装转换器。

h:outputLabel 是否通过for 属性链接到h:inputText?在这种情况下,instanceof 可能总是返回 false,因为转换后的组件将是 HtmlInputText

【讨论】:

是的,我调试了它并调用了 setStyleClass。日志包含来自代码的消息。

以上是关于为啥 UIComponent.setStyleClass() 在 JSF 2.1 转换器中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?