JSF和表达式语言:仅在属性存在时绑定属性

Fal*_*con 9 java jsf el

将数据列绑定到数据源中可能存在或可能不存在的属性的最佳方法是什么?

例如,如果您有一个类层次结构,其中某些子级可能属于具有该属性的子类型,则会发生这种情况.数据源包含各种子类类型.

<DataColumn outputText="#{item.property}" />
Run Code Online (Sandbox Code Playgroud)

当其中一个子类中不存在该属性时,始终会产生一个PropertyNotFoundException.我不想在基类中包含该属性,因为根据业务规则它不应该存在.

你会如何解决这个问题?

Bal*_*usC 8

在不改变课程的情况下,最好的办法就是选择instanceofEL 课程.您可以通过检查由(Object#getClass()然后)Class#getName()Class#getSimpleName()在EL中获取的(简单)类名来实现.

假设具有该属性的类具有完全限定名称com.example.SubItem,这是一个示例:

<h:outputText value="#{item.property}" rendered="#{item.class.name == 'com.example.SubItem'}" />
Run Code Online (Sandbox Code Playgroud)

要么

<h:outputText value="#{item.property}" rendered="#{item.class.simpleName == 'SubItem'}" />
Run Code Online (Sandbox Code Playgroud)


Fal*_*con 3

我认为在这种情况下最好的方法是为视图层创建一个包含所有必要字段的自定义实体,并将要显示的项目转换为它。