当 <f:viewParam required> 在 @NotNull 属性 上失败时发送 HTTP 400 错误
Send HTTP 400 error when <f:viewParam required> has failed on @NotNull property
我正在创建一个需要 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。
如何使 <f:viewParam />
或 <o:viewParam />
上的 required
属性起作用?
我的测试代码:
必填-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>
令人难以置信的是,我搜索了几个小时的解决方案,并在提出这个问题后 20 分钟找到了它...
我刚刚将视图参数标记替换为:
<o:viewParam name="test" value="#{requiredTestBean.value}" required="true">
<o:viewParamValidationFailed sendError="400" />
</o:viewParam>
而且效果很好。
参考:
我正在创建一个需要 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。
如何使 <f:viewParam />
或 <o:viewParam />
上的 required
属性起作用?
我的测试代码:
必填-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>
令人难以置信的是,我搜索了几个小时的解决方案,并在提出这个问题后 20 分钟找到了它...
我刚刚将视图参数标记替换为:
<o:viewParam name="test" value="#{requiredTestBean.value}" required="true">
<o:viewParamValidationFailed sendError="400" />
</o:viewParam>
而且效果很好。
参考: