And*_*ler 11 jsf-2 mojarra jboss6.x
我知道在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 2.1.1.
Bal*_*usC 21
这不是Mojarra的具体情况.这是特定于Tomcat的(JBoss使用Tomcat作为servletcontainer).将以下VM参数添加到启动选项.
-Dorg.apache.el.parser.COERCE_TO_ZERO=false
Run Code Online (Sandbox Code Playgroud)
根据我的经验,这个实际上应该只应用于Number属性(int,long等),但是因为某个已经很晚的Tomcat 6.0.x版本(至少在6.0.20之后)它似乎也被破坏了字符串,它是依赖于上面的VM参数.
例如,在GlassFish 3.x上,它完全可以正常工作.