Целое число, получающее значение по умолчанию 0, где для Java должно быть NULL

Мои требования выглядят просто, но я чувствую, что делаю что-то неправильно в коде.

Все, что мне нужно, это вставить "null" в Oracle Database, когда ничего не передается из поля InputText пользовательского интерфейса.

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, вместо нулевого значения 0 вводится в таблицу, что имеет разное значение в моей бизнес-логике, пожалуйста, помогите мне сделать необходимые изменения кода.

Ответ 1

И когда я ничего не вводил в inputText, вместо NULL 0 вводится в таблицу

Эта проблема распознается как парсер Tomcat EL, не принимая во внимание, что вы используете Integer вместо int. Вам необходимо добавить следующий аргумент VM для параметров запуска Tomcat:

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

См. также:


Он решил мою половину проблемы, и теперь он сохраняет нулевые значения, но пока он возвращается, он снова показывает 0

Эта проблема распознается как JDBC под обложками, используя ResultSet#getInt() вместо ResultSet#getObject(). Это, по сути, другая проблема, чем первая. Вы ничего не рассказали о том, как настроен уровень доступа к базе данных, поэтому трудно указать конкретное решение.

Ответ 2

Я не знаю, как вы читаете этот xhtml. На уровне java вы можете переопределить либо конструктор PaymentSpecVO, либо setter для paymStartWk

Ответ 3

Попробуйте это

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

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

Но тогда вам может понадобиться много разбора.

Изменить *

Если вы ничего не вводите в свой "входной текст", переданное значение равно null, но поскольку вы поймаете его с помощью Integer, он интерпретирует значение null в 0. Поэтому, когда вы его сохраняете, даже после манипуляции методами и переменными с нулевым значением, он будет хранить "0", потому что в основном это значение по умолчанию.

Другое решение, я думаю, делает пользовательский класс, в котором хранятся целые числа

Пример:

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

вы можете делать любые реализации, которые хотите, например, вернуть null,

Вы можете использовать это как замену классу Integer, который вы используете, если вы не хотите использовать String