Целое число, получающее значение по умолчанию 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