我有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"。
但我在我的豆中也有方法
if(getCurUser().getTypeOfSignature())
{
jpaBean.pushSignature(dataItem, 1);
}
else
{
jpaBean.pushSignature(dataItem, 2);
}
它的工作方式取决于用户签名的类型。
为什么我在JSF中总是得到NULL?或者我是个新手,做错了什么?
我之前在尝试将布尔类型与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'}"/>
你尝试过吗:
<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&任务=视图&id=107&项目ID=31