这个问题类似于:
jsf:绑定到UI中的inputtext的整数属性在提交时设置为零
但我对解决方案并不完全满意.上下文是相同的:我有一个需要Integer值的Web表单.如果文本框留空,我希望我的整数字段为'null',而EL解析器会自动将我的id字段设置为'0'.
我可以通过在本地Tomcat VM中设置JVM参数来解决问题:
-Dorg.apache.el.parser.COERCE_TO_ZERO = FALSE
但是,这对我们客户的机器不起作用.是否可以在"代码内"设置/更改此JVM参数.
更新:我发现这是请求,但如果其他人有任何其他解决方法,我也想听到.
https://issues.apache.org/bugzilla/show_bug.cgi?id=48813
更新2:我无法将值从"0"更改为"null",因为我的应用程序应将"0"视为实际ID.所以我需要在运行时知道id文本框是否为空.
我在Tomcat上有一个JSF 2.0应用程序,有很多<h:inputText>
字段可以在我的数据库中输入数据.某些字段不是必需的.
<h:inputText value="#{registerBean.user.phoneNumber}" id="phoneNumber">
<f:validateLength maximum="20" />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)
当用户将此字段留空时,JSF设置空字符串""
而不是null
.
如何在不检查每个String的情况下修复此行为
if (string.equals("")) { string = null; }
Run Code Online (Sandbox Code Playgroud) 我知道在JSF2中有很多关于将空字符串转换为null的帖子.通常的处方是将以下内容添加到web.xml中.
<context-param>
<description>Does not appear to work</description>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
这根本不起作用 - 根本没有.然后我创建了一个自定义字符串转换器来测试它是否可行.我明确地将它作为转换器添加到我的inputText中(否则它在空白时不会触发).
当INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL设置为true时,转换器接收null,输入文本的setter仍然接收"".
当INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL设置为false(或注释掉)时,转换器接收""并且输入文本的setter接收""(即使在转换器返回null之后).
@FacesConverter(forClass=java.lang.String.class, value="emptyStringToNull")
public class StringConverter implements Converter, Serializable {
private static final long serialVersionUID = -1121162636180944948L;
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || value.trim().isEmpty()) {
return null;
}
return value;
}
public String getAsString(FacesContext context, UIComponent component, Object object) {
if (object == null)
return null;
return object.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
我试过(无济于事)在getAsObject中显式设置组件提交的值:
if (component instanceof EditableValueHolder)
((EditableValueHolder) component).setSubmittedValue(null);
Run Code Online (Sandbox Code Playgroud)
我正在使用JBoss6(6.1的快照)和JSF …
我的要求看起来很简单,但我觉得我在代码中做错了.
我只需要在没有从UI的InputText字段传递任何内容时在Oracle数据库中插入"null".
PaymantSpecFormPage.xhtml
<h:inputText id="startWeek" value="#{flowScope.paymentSpecVO.paymStartWk}" styleClass="inputTypeForm" maxlength="4"/>
Run Code Online (Sandbox Code Playgroud)
PaymentSpecVO.java
public class PaymentSpecVO extends BaseVO<PaymentSpec> {
private Integer paymStartWk;
public Integer getPaymStartWk() {
return paymStartWk;
}
public void setPaymStartWk(Integer paymStartWk) {
this.paymStartWk = paymStartWk;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的数据库表中
COLUMN_NAME DATA_TYPE NULLABLE DEFAULT_VALUE
------------ --------- -------- -------------
PAYM_START_WK NUMBER(4,0) Yes null
Run Code Online (Sandbox Code Playgroud)
当我在inputText中没有输入任何内容时,那么在表格中输入0而不是null,这在我的业务逻辑中有不同的含义,请帮我做必要的代码更改.
我将bean绑定到jsp页面中的inputtext UI元素的整数属性.
最初在渲染它们时,此整数属性的默认值为null.
现在,当我在不更改此inputtext字段的情况下提交表单时,即使ui文本字段为空,此字段也会在bean中设置为整数值零.
因为我想跟踪字段的更改并仅更新配置文件中更改的那些字段,但这给我带来了问题,因为它导致对所有整数字段的更新.
我正在使用jsf 1.2
我有一个输入位置应该得到一个数字.我希望它显示为空.但是,当我运行我的程序时,我默认为0或0.00.我怎么能把它弄空?
我有一个h:selectOneRadio
组件,我已映射到Boolean
支持bean中的(不是布尔值).加载时,单选按钮没有默认选择选项,单选按钮不是必填字段.
示例代码:
JSF页面摘录:
<h:form>
<h:selectOneRadio value="#{pagecode.test}">
<f:selectItem itemValue="#{true}" itemLabel="Yes"/>
<f:selectItem itemValue="#{false}" itemLabel="No"/>
</h:selectOneRadio>
<h:commandButton value="Save" action="#{pagecode.save}"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)
支持Java页面代码:
package pagecode;
public class JSFBooleanTestView extends PageCodeBase {
protected Boolean test;
public Boolean getTest() {
return test;
}
public void setTest(Boolean test) {
this.test = test;
}
public String save() {
return "JSFBooleanTestView";
}
}
Run Code Online (Sandbox Code Playgroud)
faces-config.xml摘录:
<managed-bean>
<managed-bean-name>pagecode</managed-bean-name>
<managed-bean-class>pagecode.JSFBooleanTestView</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Run Code Online (Sandbox Code Playgroud)
由于test
没有默认值,单选按钮开始未选中.由于不需要该字段,我的期望是在没有选中单选按钮的情况下按下"保存"按钮会导致测试为空.相反,测试被指定为false.
我尝试过的不同选项没有效果:
设置 h:selectOneRadio required="false"
添加到web.xml:
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)添加到web.xml:
<context-param>
<param-name>org.apache.el.parser.COERCE_TO_ZERO</param-name>
<param-value>false</param-value>
</context-param> …
Run Code Online (Sandbox Code Playgroud)