我的要求看起来很简单,但我觉得我在代码中做错了。
当我从UI的InputText字段传递任何内容时,我只需要在Oracle数据库中插入“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;
}
}
在我的数据库表中
COLUMN_NAME DATA_TYPE NULLABLE DEFAULT_VALUE
------------ --------- -------- -------------
PAYM_START_WK NUMBER(4,0) Yes null
当我在inputText中没有输入任何内容时,那么在Table中输入0而不是null,这在我的业务逻辑中有不同的含义,请帮我做必要的代码更改。
答案 0 :(得分:17)
当我在inputText中没有输入任何内容时,则输入0
而不是null
这个问题可以识别为Tomcat的EL解析器没有考虑到您使用的是Integer
而不是int
。您需要将以下VM参数添加到Tomcat启动选项:
-Dorg.apache.el.parser.COERCE_TO_ZERO=false
它解决了我的一半问题,现在它存储了空值,但在检索时它再次显示0
使用ResultSet#getInt()
代替ResultSet#getObject()
,可以将此问题视为JDBC的问题。然而,这与第一个问题基本上是不同的问题。您没有说明如何设置数据库访问层,因此很难指出具体的解决方案。
答案 1 :(得分:-1)
我不知道你是怎么读这个xhtml的。 在java层,您可以覆盖PaymentSpecVO的构造函数或paymStartWk的setter
答案 2 :(得分:-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,
如果你不想使用String,你可以使用它作为你正在使用的整数类的替代