Почему я всегда получаю NULL в JSF, извлекающем логическое поле postgresql? - PullRequest
6 голосов
/ 20 июня 2011

У меня есть стол 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Тип подписи ЛОЖЬ» на странице результатов.

Но у меня также есть метод в моем бобе

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

И это работает правильно в зависимости от типа подписи пользователя.

Почему я всегда получаю NULL в JSF? Или я новичок и сделал что-то не так?

Ответы [ 2 ]

1 голос
/ 14 апреля 2012

Я сталкивался с этой же проблемой раньше, когда пытался использовать логический тип с JPA и JSF, Вы можете попытаться создать Custom BooleanConverter и сопоставить свою сущность JPA с логическим значением вместо логического типа raw.

Даже при том, что вы можете столкнуться с проблемами переносимости при работе с разными БД, реализациями 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'}"/>
0 голосов
/ 25 октября 2011

Вы пробовали:

<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 & Itemid = 31

...