【问题标题】:Work around for faulty INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL in Mojarra JSF 2.1在 Mojarra JSF 2.1 中解决错误的 INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
【发布时间】:2011-09-12 08:08:55
【问题描述】:

我知道有很多关于在 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>

这似乎根本不起作用。然后我创建了一个自定义字符串转换器来测试它是否可行。我明确地将它作为转换器添加到我的 inputText 中(否则它不会在空白时触发)。

当 INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 设置为 true 时,转换器接收 null 并且输入文本的设置器仍接收“”。

当 INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 设置为 false(或被注释掉)时,转换器接收“”并且输入文本的设置器接收“”(即使在转换器返回 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();
    }
}

我已经尝试(无济于事)在 getAsObject 中显式设置组件提交的值:

if (component instanceof EditableValueHolder)
    ((EditableValueHolder) component).setSubmittedValue(null);

我正在使用 JBoss6(实际上是 6.1 的快照)和 JSF 2.1.1。

【问题讨论】:

    标签: jsf-2 jboss6.x mojarra


    【解决方案1】:

    这不是 Mojarra 特定的。这是 Tomcat 特定的(JBoss 使用 Tomcat 作为 servletcontainer)。将以下 VM 参数添加到启动选项。

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

    根据我的经验,这个应该实际上只适用于Number 属性(int、long 等),但是自从某个 Tomcat 6.0.x 版本(至少在 6.0.20 之后) ) 它似乎也被字符串破坏了,它依赖于上面的 VM 参数。

    以 GlassFish 3.x 为例,它开箱即用。

    【讨论】:

    • 这很好。你知道吗,我看到你以前在其他地方回答过这个问题,但帖子只提到了 Tomcat。当然我应该意识到这也适用于 JBoss AS。
    • 注:如果元素放在&lt;ui:repeat&gt; 中,上述方法不起作用,但如果替换为&lt;c:forEach&gt; 则有效
    • @Nikhil:我认为您将它与 Mojarra 中 &lt;ui:repeat&gt; 的许多错误之一混淆了。尝试使用最新的 MyFaces,看看它的行为是否有所不同。
    • 谢谢你,BalusC。我使用了 Tomcat 7 并修复了它。谢谢你。我有一个小问题,所以在Netbean中,我只需右键单击Tomcat服务器并添加JVM选项,但是,我必须在真实服务器上设置此选项。我在 tomcat 目录的哪里设置这个 JVM 选项,BalusC?
    • @Thang:设置 JAVA_OPTS 环境变量或编辑 Tomcat 启动脚本,或者如果它是 Windows 服务,请将其设置在 Apache 羽毛系统托盘图标后面的设置面板中。
    猜你喜欢
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2022-06-13
    • 2015-01-05
    • 2011-12-10
    • 2011-11-28
    • 2013-06-18
    • 1970-01-01
    相关资源
    最近更新 更多