【问题标题】:Why do I always get NULL in JSF fetching postgresql boolean field?为什么我在 JSF 获取 postgresql 布尔字段时总是得到 NULL?
【发布时间】:2011-09-18 12:05:23
【问题描述】:

我有 Postgresql 8.4 表

CREATE TABLE users
(
  username character varying(50) NOT NULL,
  "password" character varying(50) NOT NULL,
  enabled boolean NOT NULL,
  type_of_signature boolean NOT NULL,
  companyusers2_id integer NOT NULL,
  numberorganizac character(8) NOT NULL,
);

在那张表中我只有一行:“”admin”;”admin”;TRUE;TRUE;1;”12345678”

我有 JPA

@Entity
@Table(name="users")
public class Users implements Serializable {
    ...
    private boolean typeOfSignature;
    ...

    @Column(name="type_of_signature")
    public boolean getTypeOfSignature() {
        return this.typeOfSignature;
    }

    public void setTypeOfSignature(boolean typeOfSignature) {
        this.typeOfSignature = typeOfSignature;
    }
    ...
}

我有 JSF

<h:outputText value="Type of signature is NULL" rendered="#{curUser.typeOfSignature == null}"/>
<h:outputText value="Type of Signature is TRUE" rendered="#{curUser.typeOfSignature}"/>
<h:outputText value="Type of Signature is FALSE" rendered="#{!curUser.typeOfSignature}"/>

我总是在结果页面上得到“签名类型为 NULLType of Signature is FALSE”。

但我的 bean 中也有方法

if(getCurUser().getTypeOfSignature())
    {
        jpaBean.pushSignature(dataItem, 1);
    }
    else
    {
        jpaBean.pushSignature(dataItem, 2);
    }

而且它的工作原理取决于用户签名的类型。

为什么我在 JSF 中总是得到 NULL?还是我是新手,做错了什么?

【问题讨论】:

  • 我不知道 JSF,但我确实看到您的字段是 boolean,而不是 BooleangetCurUser().getTypeOfSignature() == null 将是 Java 中的编译错误。这就是 JSF 处理错误情况的方式吗?
  • 我试过Booleanboolean。两种变体产生相同的结果 签名类型为 NULL 签名类型为 FALSE
  • 对不起,我的错。我应该使用#{BEAN_NAME.curUser.typeOfSignature}
  • @Adrian,我相信由于自动装箱功能,这不会是编译错误。 en.wikipedia.org/wiki/…
  • @maple_shaft,根据 Eclipse 中的快速测试,The operator == is undefined for the argument type(s) boolean, null。自动拆箱会将函数参数中的 boolean 提升为 Boolean,但不允许与 null 进行比较。

标签: java postgresql jsf jpa boolean


【解决方案1】:

你试过了吗:

<h:outputText value="Type of signature is True" rendered="#{true}"/>
<h:outputText value="Type of signature is False" rendered="#{false}"/>

如果这些失败,则意味着值绑定器有问题。它不应该用于基本的 html 元素。

import javax.faces.component.ActionSource;
import javax.faces.component.UIComponent;
import javax.faces.component.ValueHolder;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.el.ValueBinding;


public class MyHtmlOutputText extends HtmlOutputText {

    public boolean isRendered() {
        if (rendered != null) {
            return rendered;
        }

        ValueBinding vb = getValueBinding("rendered");
        Boolean v = vb != null ? (Boolean) vb.getValue(getFacesContext()) : null;
        return v != null ? v : DEFAULT_DISABLED;
    }

    public boolean getRendered() {
        return isRendered();
    }

}

出于某种原因,我不存储值绑定的结果。这是因为存储到状态中的值将不再从运行时的原始表达式中解析出来。这是我们绝对不想拥有的。

您将在此处了解如何将您的 MyHtmlOutputText 组件注册到 facelets 上下文中:http://hanzz.lbs-logics.at/index.php?option=com_content&task=view&id=107&Itemid=31

【讨论】:

    【解决方案2】:

    在尝试将布尔类型与 JPA 和 JSF 一起使用时,我遇到了同样的问题, 您可以尝试创建一个自定义 BooleanConverter 并使用布尔值而不是原始类型布尔值映射您的 JPA 实体。

    即使您在使用不同的 DB、JSF 和 JPA 实现运行它时可能会遇到可移植性问题。我强烈建议您更改在 JPA 中将布尔值映射为字符串的方法:

    CREATE TABLE users
    (
      username character varying(50) NOT NULL,
      "password" character varying(50) NOT NULL,
      enabled haracter(1) NULL,
      type_of_signature char(1) NOT NULL,
      companyusers2_id integer NOT NULL,
      numberorganizac character(8) NOT NULL,
    );
    

    你的映射会变成:

    @Entity
    @Table(name="users")
    public class Users implements Serializable {
        ...
        private String typeOfSignature;
        ...
    
        @Column(name="type_of_signature")
        public String getTypeOfSignature() {
            return this.typeOfSignature;
        }
    
        public void setTypeOfSignature(String typeOfSignature) {
            this.typeOfSignature = typeOfSignature;
        }
        ...
    }
    

    用一行填充您的记录:""admin";"admin";'T';'T';1;"12345678" 那么在 JSF 中你会得到不同的结果:

    <h:outputText value="Type of signature is NULL" rendered="#{empty curUser.typeOfSignature}"/>
    <h:outputText value="Type of Signature is TRUE" rendered="#{curUser.typeOfSignature eq 'T'}"/>
    <h:outputText value="Type of Signature is FALSE" rendered="#{!curUser.typeOfSignature eq 'T'}"/>
    

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 2013-04-15
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 2012-05-07
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多