为什么我总是在JSF中获取NULL以获取postgresql布尔字段?

时间:2011-06-20 08:15:23

标签: java postgresql jsf jpa boolean

我有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}"/>

我总是在结果页面上得到“签名类型为签名的NULL类型为FALSE”。

但我的bean中也有方法

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

根据用户签名的类型,它可以正常工作。

为什么我总是在JSF中得到NULL?或者我是一个新手并做错了什么?

2 个答案:

答案 0 :(得分:1)

在尝试使用JPA和JSF的布尔类型之前,我遇到了同样的问题, 您可以尝试创建一个Custom 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'}"/>

答案 1 :(得分:0)

你有没有尝试过:

<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