JSF Primefaces:如何对<f:selectItems>呈现的HTML下拉列表中的项目使用三元运算符?

问题描述

Am使用JSF Primefaces 7.0渲染XHTML文件,以在单个HTML下拉列表中显示用户列表(以及他们的电子邮件地址)。


pom.xml:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.10</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>7.0</version>
</dependency>

<dependency>
    <groupId>org.primefaces.extensions</groupId>
    <artifactId>primefaces-extensions</artifactId>
    <version>7.0.3</version>
</dependency>

用户类别:

package com.myapp.model;

import static org.apache.commons.lang3.StringUtils.isBlank;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@Data
public class User implements Serializable {

    private String firstName;

    private String lastName; 

    // this is their e-mail address
    private String username; 

    public String getName() {

        final StringBuilder sb = new StringBuilder();
     
        if (!isBlank(getFirstName())) {
            sb.append(getFirstName()).append(' ');
        }
     
        if (!isBlank(getLastName())) {
            sb.append(getLastName());
        }
     
        return sb.toString().trim();
    }
}

内部用户。xhtml:

<html
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jstl/core"
>
    <f:selectItems
       value="#{userReport.users}"
       var="user"
       itemLabel="#{user.name} (#{user.username})"
       itemValue="#{user}"/>
    </p:selectOneMenu>
</html>

如果HTML下拉列表中的{user.name不为null,则可以正确显示单个项目:

John Doe (jdoe@email.com)


如何使用条件(<c:if><c:else>甚至是? :三元运算符)来设置itemLabel属性以仅渲染user.username user.name是否为空字符串或null是否没有括号?

因此,如果user.name为null或为空字符串,则应将其设置为此(电子邮件地址):

itemLabel="#{user.username}"

要显示(如果user.name为空或空字符串):

jdoe@email.com


尝试这样做:

itemLabel="#{not empty user.name ? user.name (user.username) : user.username}"

这给了我以下堆栈跟踪信息:


javax.servlet.ServletException: Method not found: class com.myapp.model.User.name(java.lang.String)
    at javax.faces.webapp.FacesServlet.executeLifecyle(FacesServlet.java:749)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:475)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
Caused by: javax.el.MethodNotFoundException: Method not found: class com.myapp.model.User.name(java.lang.String)
    at javax.el.Util.findWrapper(Util.java:373)
    at javax.el.Util.findMethod(Util.java:219)
    at javax.el.BeanELResolver.invoke(BeanELResolver.java:149)
    at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:79)
    ... 35 more

不知道为什么会这样,因为原始属性确实找到了User.getName()方法:

itemLabel="#{user.name} (#{user.username})"

有更好的方法吗?

解决方法

通过使用+=串联运算符来解决这个问题:

itemLabel="#{!empty user.name ? user.name += ' (' += user.username += ')' : user.username}"

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...