当<f:viewparam required =“”>在@NotNull属性上失败时发送HTTP 400错误

时间:2016-04-29 16:17:45

标签: validation jsf omnifaces http-status-code-400 viewparams

我正在创建一个需要GET参数来显示数据的JSF 2.2页面,但我很难强制执行该参数。

我也尝试使用Omnifaces's viewParam但没有成功,我不知道该怎么做。

我还找到了similar issue on this link,我尝试了所有建议......

当我打开时:

  • http://url-to/required-test.xhtml?test=foo

它正常工作,显示Param is: foo

但是当我打开时:

  • http://url-to/required-test.xhtml?test=
  • http://url-to/required-test.xhtml
显示

Param is: null!而不是验证错误消息。仅显示null!因为我为此测试添加了一个特殊的outputText,在实际应用程序中它会在某处导致NullPointerException。

如何在required<f:viewParam />上设置<o:viewParam />属性?

我的测试代码:

所需-test.xhtml     

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:o="http://omnifaces.org/ui">
<f:metadata>
    <f:viewParam name="test" value="#{requiredTestBean.value}" required="true" />
</f:metadata>

<h:head>
    <title>Required Test</title>
</h:head>

<h:body>
    Param is:
    <h:outputText value="#{requiredTestBean.value}" rendered="#{requiredTestBean.value != null}" />
    <h:outputText value="null!" rendered="#{requiredTestBean.value == null}" />
</h:body>
</html>

RequiredTestBean.java

package test;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.validation.constraints.NotNull;

@ManagedBean
@RequestScoped
public class RequiredTestBean
{
    @NotNull
    private String value;

    @NotNull
    public String getValue()
    {
        return value;
    }

    public void setValue(@NotNull String value)
    {
        this.value = value;
    }
}

web.xml

上的上下文参数
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.CLIENT_WINDOW_MODE</param-name>
    <param-value>url</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>true</param-value>
</context-param>

1 个答案:

答案 0 :(得分:1)

令我难以置信的是,我如何在数小时内搜索解决方案,并在提出这个问题后20分钟找到它......

我刚刚将视图param标签替换为:

<o:viewParam name="test" value="#{requiredTestBean.value}" required="true">
    <o:viewParamValidationFailed sendError="400" />
</o:viewParam>

它完美无缺。

参考:https://stackoverflow.com/a/29841384/804976