11

私の要件は単純に見えますが、コードで何か間違ったことをしているように感じます。

UIのInputTextフィールドから何も渡されないときに、Oracle Databaseに「null」を挿入するだけです。

PaymantSpecFormPage.xhtml

<h:inputText id="startWeek" value="#{flowScope.paymentSpecVO.paymStartWk}" styleClass="inputTypeForm" maxlength="4"/>

PaymentSpecVO.java

public class PaymentSpecVO extends BaseVO<PaymentSpec> {
   private Integer paymStartWk;

   public Integer getPaymStartWk() {
      return paymStartWk;
   }
   public void setPaymStartWk(Integer paymStartWk) {
      this.paymStartWk = paymStartWk;
   }
}

そして私のDBテーブルで

COLUMN_NAME      DATA_TYPE    NULLABLE    DEFAULT_VALUE
------------     ---------    --------    -------------
PAYM_START_WK    NUMBER(4,0)    Yes             null

また、inputText に何も入力しないと、null の代わりに 0 がテーブルに入力されます。これは、ビジネス ロジックでは意味が異なります。必要なコードの変更を手伝ってください。

4

3 に答える 3

17

そして、inputTextに何も入力しないと、nullの代わりに0がテーブルに入力されます

Integerこの問題は、Tomcat の EL パーサーが の代わりに使用していることを考慮していないため認識できますint。次の VM 引数を Tomcat の起動オプションに追加する必要があります。

-Dorg.apache.el.parser.COERCE_TO_ZERO=false

以下も参照してください。


それは私の半分の問題を解決し、現在はnull値を格納していますが、取得中に再び0が表示されます

この問題は、JDBC が内部で のResultSet#getInt()代わりに使用されていることで認識できますResultSet#getObject()。ただし、これは本質的に最初の問題とは異なります。データベース アクセス層がどのように設定されているかについては何も言わなかったので、具体的な解決策を指摘するのは困難です。

于 2013-08-23T11:15:10.943 に答える
-1

これを試して

    public class PaymentSpecVO extends BaseVO<PaymentSpec> {
    private String paymStartWk;

    public String getPaymStartWk() {
    return paymStartWk;
    }
    public void setPaymStartWk(Integer paymStartWk) {
    this.paymStartWk = paymStartWk+"";
  }
}

しかし、そこでは多くの解析が必要になる場合があります。

編集*

「入力テキスト」に何も入力しない場合、渡された値はnullですが、整数でキャッチしているため、nullを0に解釈します。したがって、保存すると、メソッドと変数を null に操作した後でも、保存されます"0" 、基本的にそれがデフォルト値だからです。

私が考える別の解決策は、整数を格納するカスタムクラスを作成することです

例 :

    public class IntegerVal extends Number {
    private Max_val = 10000000;
    private Min_val = -10000000;
    private String default = null;
    }

nullを返すなど、必要な実装を行うことができます。

文字列を使用したくない場合は、使用している整数クラスの代わりにそれを使用できます

于 2013-08-23T01:32:08.473 に答える