问题
我正在尝试验证强制GET请求参数。
在视图中我添加了相应的viewParam标记。
<f:metadata>
<f:viewParam name="customerId" value="#{customerDetailBean.customerId}"/>
</f:metadata>
我的CDI bean看起来像这样
@Model
public class CustomerDetailBean {
@NotNull
private Integer customerId;
public Integer getCustomerId() {
return customerId;
}
public void setCustomerId(Integer customerId) {
this.customerId = customerId;
}
}
当我使用以下请求时,验证工作正常,并显示预期的验证消息。
http://localhost:8080/getsupport/customerdetail.jsf?customerId=
但是,当我通过删除参数customerId更改请求时,将跳过验证并且不显示任何消息。
http://localhost:8080/getsupport/customerdetail.jsf
有没有办法让它按预期工作?
解决方法
我已将viewParam声明更改为
<f:metadata>
<f:viewParam name="customerId" value="#{customerDetailBean.customerId}" required="true" />
</f:metadata>
该更新版本适用于第二个请求。无论如何,我更愿意使用bean验证。
我的设置
的web.xml
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
答案 0 :(得分:1)
不幸的是,这是&#34;按设计工作&#34;。如果没有提交任何内容,则会跳过所有验证。只有<f:viewParam required>
有特殊待遇。当没有提交任何内容时,也会考虑它。另请参阅UIViewParameter#processValidators()
javadoc和source code。
在Mojarra issue tracker中,我只能找到issue 3058作为相关问题,因此<f:validateRequired>
未被考虑。从技术上讲,这与您@NotNull
面临的问题实际上完全相同。我已就此创建了issue 3339。
同时,你最好的选择是回到required="true"
。自定义组件也可以,但据我所知,这不会是微不足道的。
更新:毕竟,修补程序相对简单,并且在当前2.0快照发布中的implemented OmniFaces中已<o:viewParam>
。
答案 1 :(得分:0)
在JSF 2.0之前,根本没有在其值为的字段上运行验证 空或null。 JSF 2.0略微更改了此默认行为。如果正在执行JSF运行时 支持bean验证的环境,默认情况下验证空字段。除此以外, 行为与JSF 2.0之前的行为相同:未验证空字段。
由于Tomcat(&amp; Jetty)不是J2EE兼容的服务器,因此默认情况下不启用验证。这就是您跳过验证的原因。
要强制JSF验证空字段,请将其添加到web.xml文件中:
<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>true</param-value>
</context-param>
Bean验证(JSR 303)可以在非j2ee兼容服务器上配置,配置最少(我从未配置过这个:))。在某种程度上,您已启用bean验证,并且您没有上面的上下文参数,那么jsf运行时会将其视为true并验证空和空字段以进行验证。
但我建议使用必需属性,这是建议专家的表现,因为使用注释可以反射。所以我们可以避免至少一个案例。
确保web.xml中的上下文参数javax.faces.validator.DISABLE_DEFAULT_BEAN_VALIDATOR
未设置为true。
要查看这些参数列表,请参见
Overview of all JSF-related web.xml context parameter names and values
希望这有帮助。