无法读取JSP EL中的Boolean属性

时间:2011-04-18 01:05:16

标签: jsp el

如果对象属性声明为Boolean类型(不是原始布尔值),那么EL识别出来就会出现问题!

假设您有以下对象

class Case{
     private Boolean  valid;

     public Boolean isValid(){
         return this.valid;
     }

     public void setValid(Boolean val){
         this.valid = val;
     }
}

假设我们在名称为“case”的请求中放置了Case类型的对象,然后我在JSP中尝试这个:

<td>Object is ${case.valid ? "Valid":"Invalid"} </td>

这给我错误“有效”不是对象Case的属性!如果我将有效值从布尔值更改为原始布尔值,则可以正常工作!

这是EL中布尔类型的一个已知问题,它们不被识别为布尔值而是被识别为Java“普通”对象?处理这个问题的正确方法是什么?

由于

3 个答案:

答案 0 :(得分:19)

我见过的所有示例都讨论boolean属性,除了isProperty()getProperty()之外,还允许使用Boolean格式的获取者。

我找不到这种行为的“正式”引用,但this blog post似乎描述了我最初评论时的疑问 - Boolean是一个对象而boolean是一个原语,当Java有自动装箱时,EL将忽略返回isProperty()的{​​{1}} getter,而是查找Boolean方法。

所以我怀疑,在您的示例中,如果您将getProperty()的返回类型更改为isValid()而不是boolean(但将字段类型保留为Boolean }),您的EL表达式将按预期工作。

答案 1 :(得分:4)

EL将布尔值视为对象(完全正确),因此它会查找getValid()方法。这与JavaBeans规范一致。

尝试将您的属性从Boolean引用类型更改为boolean基元类型。如果这是不可能的并且您正在使用新的EL(即2.2 - 我不确定2.1),您可以调用方法,因此${case.isValid()}将是正确使用此新EL功能的示例。

答案 2 :(得分:0)

JSP允许或禁止is / get-getter,布尔值/布尔值字段和布尔值/布尔值getter的某些组合。如下:

禁止组合:

Boolean method, getting by is

允许的组合:

Boolean method, getting by get
boolean method, getting by is
boolean method, getting by get

布尔/布尔类型的字段无关。

在IntelliJ中,足以自动生成吸气剂。


通过启动所有组合进行检查。

    <c:if test="${actionBean.code_FMI}">
        <div>Boolean field, Boolean method, getting by is</div>
    </c:if>
    <c:if test="${actionBean.code_FMG}">
        <div>Boolean field, Boolean method, getting by get</div>
    </c:if>
    <c:if test="${actionBean.code_FmI}">
        <div>Boolean field, boolean method, getting by is</div>
    </c:if>
    <c:if test="${actionBean.code_FmG}">
        <div>Boolean field, boolean method, getting by get</div>
    </c:if>
    <c:if test="${actionBean.code_fMI}">
        <div>boolean field, Boolean method, getting by is</div>
    </c:if>
    <c:if test="${actionBean.code_fMG}">
        <div>boolean field, Boolean method, getting by get</div>
    </c:if>
    <c:if test="${actionBean.code_fmI}">
        <div>boolean field, boolean method, getting by is</div>
    </c:if>
    <c:if test="${actionBean.code_fmG}">
        <div>boolean field, boolean method, getting by get</div>
    </c:if>

Java bean:

private Boolean code_FMI = true, code_FmI = true, code_FMG = true, code_FmG = true;
private boolean code_fMI = true, code_fmI = true, code_fMG = true, code_fmG = true;

public Boolean isCode_FMI() {
    return code_FMI;
}

public boolean isCode_FmI() {
    return code_FmI;
}

public Boolean getCode_FMG() {
    return code_FMG;
}

public boolean getCode_FmG() {
    return code_FmG;
}

public Boolean isCode_fMI() {
    return code_fMI;
}

public boolean isCode_fmI() {
    return code_fmI;
}

public Boolean getCode_fMG() {
    return code_fMG;
}

public boolean getCode_fmG() {
    return code_fmG;
}