访问xhtml视图中的Enum

时间:2014-09-05 16:17:37

标签: jsf enums facelets

我有一个视图(.xhtml),该视图包含一个dataTable。在dataTable中,有一个名为“Type”的列对应于属性“CTYPE”。 CTYPE存储三种类型的值:'AB','BC'和'CD'。然后我有一个Enum,将这些值转换为更合适的字符串。 例如:'AB' - > '我的字符串测试1'等等,其中'AB'是键,'My String test 1'是对应的描述(值)。 上面提到的dataTable的列(“Type”)显示了每个键的描述,即,它代替'AB'显示'My String test 1',依此类推。 该列是一个sorteableColumn,并有一个sortKey ='CTYPE',按类型对列进行排序。问题是我想按描述而不是按键对列进行排序。所以,我想按'My String test 1','My String test 2'排序......而不是'AB','BC'... 为了实现这一点,我的sortKey必须能够访问Enum并将密钥转换为相应的描述。但是,我无法做到这一点。

我的.xhtml:

 <p:column>
   <f:facet name="header">
     <ccomponent:sortableColumn model="#{typeSearchM}"
                                controller="#{typeSearchC}"
                                label="#{msg['labels.types.type_method']}"
                                sortKey="CTYPE" />
   </f:facet>
   <h:outputText value="#{msg[typeDTO.getTypesMethod()]}" />
 </p:column>

我的TypeDTO.java:

public String getTypesMethod() {
    return DestinationTypeDomain.getDescByKey(typeData.getCType());
}

其中DestinationTypeDomain是将密钥转换为描述的枚举。 我想要的是将sortKey改为:

sortKey="#{DestinationExpeditionDomain.getDescByKey(typeDTO.destinationDesc)}"

1 个答案:

答案 0 :(得分:0)

我通常让@ApplicationScoped托管bean执行这种职责。忘记在枚举中直接硬编码描述,如果有一天你想添加多语言支持,它会使事情变得更复杂。只需使用原始枚举:

@ManagedBean
@ApplicationScoped
public class UtilsBean{

    public String typeDescription(Type type){
        switch (type){
            case AB: return "My String test 1";
            //Add every single case
        }
    }

}

然后你只需要在你想要的地方使用它,它可以用于你的应用程序的每个视图:

<p:column sortBy="#{utilsBean.typeDescription(type)}">
    #{utilsBean.typeDescription(type)}
</p:column>