- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 OmniFaces 1.11 有疑问 <o:validateBean />
在类(class) ( http://showcase.omnifaces.org/validators/validateBean )
基本上,我试图根据我单击的按钮使用两个验证组来验证同一个 bean:
<h:commandButton value="Mandatory">
<o:validateBean value="#{testBean.pojo}" validationGroups="bo.ihm.beans.Mandatory" />
</h:commandButton>
<h:commandButton value="Optional">
<o:validateBean value="#{testBean.pojo}" validationGroups="javax.validation.groups.Default" />
</h:commandButton>
每当我点击一个按钮时,我得到
GRAVE: Exception occured while doing validation.
javax.el.ELException: /testOmnifaces.xhtml @21,74 value="#{testBean.pojo.forain}": java.lang.IllegalArgumentException: Cannot convert PROPERTY of type class org.omnifaces.el.ExpressionInspector$ValueExpressionType to class java.lang.Boolean
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
at org.omnifaces.el.ExpressionInspector.getValueReference(ExpressionInspector.java:43)
at org.omnifaces.taghandler.ValidateBean$6.invoke(ValidateBean.java:331)
at org.omnifaces.taghandler.ValidateBean$6.invoke(ValidateBean.java:326)
at org.omnifaces.util.Components$ForEach$1.visit(Components.java:508)
at org.omnifaces.util.Components$ForEach$TypesVisitCallback.visit(Components.java:573)
at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1689)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIForm.visitTree(UIForm.java:371)
at org.omnifaces.util.Components$ForEach.invoke(Components.java:541)
at org.omnifaces.util.Components$ForEach.invoke(Components.java:505)
at org.omnifaces.taghandler.ValidateBean.forEachInputWithMatchingBase(ValidateBean.java:326)
at org.omnifaces.taghandler.ValidateBean.access$400(ValidateBean.java:151)
at org.omnifaces.taghandler.ValidateBean$3.run(ValidateBean.java:286)
at org.omnifaces.taghandler.ValidateBean$ValidateBeanCallback.invoke(ValidateBean.java:430)
at org.omnifaces.util.Events$1.invoke(Events.java:278)
at org.omnifaces.util.Events$4.beforePhase(Events.java:312)
at org.omnifaces.eventlistener.CallbackPhaseListener.beforePhase(CallbackPhaseListener.java:63)
at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:228)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:99)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:696)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:521)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:138)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:564)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:213)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1097)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:448)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1031)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:200)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:446)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:271)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:246)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.el.ELException: java.lang.IllegalArgumentException: Cannot convert PROPERTY of type class org.omnifaces.el.ExpressionInspector$ValueExpressionType to class java.lang.Boolean
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:229)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
... 44 more
Caused by: java.lang.IllegalArgumentException: Cannot convert PROPERTY of type class org.omnifaces.el.ExpressionInspector$ValueExpressionType to class java.lang.Boolean
at com.sun.el.lang.ELSupport.coerceToBoolean(ELSupport.java:189)
at com.sun.el.lang.ELSupport.coerceToType(ELSupport.java:394)
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:227)
... 45 more
testWithClassLevelValidation.xhtml :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:o="http://omnifaces.org/ui">
<f:metadata>
<f:viewAction action="#{testBean.init}" />
</f:metadata>
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>
</h:head>
<h:body>
<h:form id="formaliteACCRE">
<h:panelGrid columns="1" style="width: 100%;">
<h:panelGrid columns="2" style="width: 100%; display: inline-block;">
<h:outputLabel for="forain">Yes or No ?</h:outputLabel>
<h:selectBooleanCheckbox id="forain" value="#{testBean.pojo.forain}">
<f:ajax execute="forain" render="groupeDomicile" />
</h:selectBooleanCheckbox>
</h:panelGrid>
<h:panelGroup id="groupeDomicile">
<h:outputText value="Yes" rendered="#{testBean.pojo.forain}" />
<h:outputText value="No" rendered="#{not testBean.pojo.forain}" />
</h:panelGroup>
<h:inputText id="numeroSecu" value="#{testBean.pojo.numeroSecuriteSociale}" maxlength="13" size="13" />
<h:inputText id="numeroSecuCle" value="#{testBean.pojo.cleSecuriteSociale}" maxlength="2" size="3" />
<h:panelGrid columns="2" style="width: 100%; display: inline-block;">
<h:inputText id="mandatory" value="#{testBean.pojo.mandatory}" maxlength="13" size="13" />
<h:outputText value="*" style="color:red;" />
</h:panelGrid>
<f:ajax execute="@form" render="@form">
<h:commandButton value="Mandatory">
<o:validateBean value="#{testBean.pojo}" validationGroups="bo.ihm.beans.Mandatory" />
</h:commandButton>
<h:commandButton value="Optional">
<o:validateBean value="#{testBean.pojo}" validationGroups="javax.validation.groups.Default" />
</h:commandButton>
</f:ajax>
</h:panelGrid>
<ui:remove> ################################################################################################ </ui:remove>
<ui:remove> ===== MESSAGES D'ERREURS ===== </ui:remove>
<ui:remove> ################################################################################################ </ui:remove>
<h:panelGroup id="messagesErreur">
<h:panelGrid class="dr-pnl" width="100%" rendered="#{not empty facesContext.messageList}">
<h:messages style="color:red;" />
</h:panelGrid>
</h:panelGroup>
</h:form>
</h:body>
</html>
测试对象.java :
package bo.ihm.beans;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.validation.Valid;
@ViewScoped
@ManagedBean(name = "testBean")
public class TestBean implements Serializable {
private static final long serialVersionUID = 1L;
@Valid
private Pojo pojo;
public Pojo getPojo() {
return pojo;
}
public void init() {
pojo = new Pojo();
pojo.setNumeroSecuriteSociale("2531257351038");
pojo.setCleSecuriteSociale("22");
}
public void setPojo(final Pojo pPojo) {
this.pojo = pPojo;
}
}
Pojo.java :
package bo.ihm.beans;
import org.hibernate.validator.constraints.NotEmpty;
@NumeroSecuriteSociale
public class Pojo {
private boolean forain;
private String cleSecuriteSociale;
private String numeroSecuriteSociale;
@NotEmpty(groups = Mandatory.class)
private String mandatory;
public String getCleSecuriteSociale() {
return cleSecuriteSociale;
}
public String getMandatory() {
return mandatory;
}
public String getNumeroSecuriteSociale() {
return numeroSecuriteSociale;
}
public boolean isForain() {
return forain;
}
public void setCleSecuriteSociale(final String pCleSecuriteSociale) {
cleSecuriteSociale = pCleSecuriteSociale;
}
public void setForain(final boolean pForain) {
forain = pForain;
}
public void setMandatory(final String pMandatory) {
mandatory = pMandatory;
}
public void setNumeroSecuriteSociale(final String pNumeroSecuriteSociale) {
numeroSecuriteSociale = pNumeroSecuriteSociale;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append("Pojo [forain=");
builder.append(forain);
builder.append(", cleSecuriteSociale=");
builder.append(cleSecuriteSociale);
builder.append(", numeroSecuriteSociale=");
builder.append(numeroSecuriteSociale);
builder.append(", mandatory=");
builder.append(mandatory);
builder.append("]");
return builder.toString();
}
}
完整代码可在 https://github.com/ErwanLeroux/Bo_ihm_test_omnifaces 获得只需运行 clean jetty:run-war et go to http://localhost:14080/bo_ihm/testWithClassLevelValidation.xhtml
第二页http://localhost:14080/bo_ihm/testWithoutClassLevelValidation.xhtml她是为了证明类级别约束不起作用,当我单击任何时候按钮时,我应该收到这样的验证错误消息:'Pojo [forain=false, cleSecuriteSociale=22, numeroSecuriteSociale=2531257351038, mandatory=null] is无效'
最佳答案
事实证明,隐式 EL 强制转换是造成这一切的原因。我们传递内部值,如 ValueExpressionType.PROPERTY
和 ValueExpressionType.METHOD
指示 EL 表达式是表示属性(getter/setter)调用还是方法(操作)调用。但是,如果该值具有隐式 EL 强制支持,则此方法失败,例如 java.lang.Boolean
,EL 将在其上隐式转换,例如一串 "true"
到 bool 值 true
.
这种传递内部值以指示 EL 表达式类型的方法是因为 OmniFaces 2.0 用于分解 <o:grapicImage value>
中的 EL 表达式。并提取任何 EL 方法参数,以便它们可以转换并作为 HTTP 查询字符串参数传递。这就解释了为什么它在 OmniFaces 1.x 中仍然运行良好。
根据 this commit ,OmniFaces 2.2 已修复此问题。
关于jsf - IllegalArgumentException : Cannot convert PROPERTY of type class org. omnifaces.el.ExpressionInspector$ValueExpressionType 类 java.lang.Boolean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31209226/
我正在使用SpringBoot和JPA来调用db,我遇到异常 org.springframework.core.convert.ConverterNotFoundException: No conve
我尝试实现 Spring Converter,但在单元测试中出现错误: Kotlin: Null can not be a value of a non-null type TodoItem 如果我尝
我在 Spring Boot 2.0 示例中使用 Spring Data Redis。在此示例中,我尝试将客户数据 + 学生数据保存在一起。我不太确定这里的数据建模是如何发生的,但假设它与 Mongo
我在 Spring 的 XML 配置文件之一中有以下代码:
我们正在尝试使用 hibernate Converter 来加密/解密通过 hibernate 存储的几列数据 @Convert(attributeName="myattr",converter=Da
我有this我必须实现的功能: protected override ValidationResult IsValid( Object value, ValidationContext
我看到了 std::convert::Into有任何实现 std::convert::From 的实现: impl Into for T where U: From, 在Rust 1.0标准库
Convert.ChangeType 或 Convert.ToInt32 或 int.Parse 之间是否存在性能优势 最佳答案 如果您知道要将 string 转换为 Int32,使用 Convert
我会定期浏览我的家庭作业以供上课。我的扫描仪将原始 jpg 文件导出到 USB,然后我可以从那里使用 gimp 编辑文件并将其另存为 pdf。我发现一种节省时间的方法是将我的多页作业导出为 .mng
Grails版本:2.3.8我在BootStrap.groovy中注册了一个自定义日期编码器,但是当我使用日期填充为Json的Object时,它将引发异常:Exception message is C
我会定期浏览我的家庭作业以供上课。我的扫描仪将原始 jpg 文件导出到 USB,然后我可以从那里使用 gimp 编辑文件并将其另存为 pdf。我发现一种节省时间的方法是将我的多页作业导出为 .mng
我正在尝试制作一个 SKAction,以便我的玩家慢慢地被拉向一个要杀死他的敌人。实际上,问题在于玩家和敌人处于不同的节点,遵循以下层次结构: 场景(SKScene)-PARENT->播放器(SKNo
我通过 xml 设置了 spring data mongo 自定义转换器,如下所示 在自定义读/写转换器中,我想
我正在尝试使用名为 Simple Captcha 的 gem 这需要在机器上安装 ImageMagick。我已经安装了它并且 convert --version 显示了这个 Version: Imag
我正在尝试使用名为 Simple Captcha 的 gem 这需要在机器上安装 ImageMagick。我已经安装了它并且 convert --version 显示了这个 Version: Imag
我正在使用 Spring JPA,我需要有一个 native 查询来调用存储过程。从结果中,我只需要获取两个字段,即代码和消息。我创建了一个包含两个字段代码和消息的类。它不起作用,这是我收到的错误:
我首先有多部分文件,我想将其发送到camel管道并使用原始名称保存该文件。 我的代码: @Autowired ProducerTemplate producerTemplate; ...
我的maven项目使用了spring、hibernate。我得到“没有这样的方法错误”。我相信这是由于依赖项中的版本冲突造成的,但不知道是什么。构建成功。但是在“NetBeans:在 GlassFis
TL;DR:Vaadin 8 中是否有类似于 Vaadin 7 的转换器来更新 UI 中输入字段的表示? IE。在输入字段失去焦点后立即从用户输入中删除所有非数字,或将小数转换为货币? Vaadin
我昨天问了一个问题here关于从匿名对象读取属性并将它们写入类的私有(private)字段。问题解决了。这是一个小故事: 我有一些 json 格式的数据。我将它们反序列化为 ExpandoObject
我是一名优秀的程序员,十分优秀!