- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在为以后的 i18n 定义一些 bean 验证消息。此消息应验证输入的类型为 number/BigDecimal:
class Payment {
@Digits(message = "test error msg", fraction = 2, integer = 13)
private BigDecimal amount;
}
<p:inputText value="#{payment.amount}" />
不幸的是,如果我尝试输入文本,我没有得到我定义的信息,但是:
'asd' must be a signed decimal number
谁能解释一下为什么?或者更确切地说,如何强制我的输入字段始终使用 @Digits 进行验证?
最佳答案
在 JSF 中,验证发生在之后 转换。如果您在映射到支持 bean 中的 BigDecimal 的文本字段中输入的不是数字,JSF 将尝试将其转换为 BigDecimal,当然会失败。所以 Hibernate Validator 不会真正有机会发挥作用。您需要本地化 JSF 转换消息以实现您想要的。
我不熟悉@Digits 注释。但是 Hibernate Validator docs似乎表明它验证该数字是否正在使用预期数量的整数和小数位数。因此,不要在文本字段中输入文本,而是尝试输入一个与 validator 接受的格式不同的值(在您的例子中,分数 = 2,整数 = 13)。因此,请尝试输入值 123.123120 并查看是否收到预期的消息。
这是进入实体并在转换器处获取注释的 hack。首先,您需要为数字创建一个自定义转换器(在本例中为 BigDecimal):
@FacesConverter("MyBigDecimalConverter")
public class MyBigDecimalConverter extends NumberConverter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
try {
HtmlInputText it = (HtmlInputText) arg1;
ValueExpression ve = it.getValueExpression("value");
String expression = ve.getExpressionString();
String field = expression.replaceAll("#\\{.*\\.", "");
field = field.replace("}", "");
String parent = expression.replace("." + field, "");
ExpressionFactory expressionFactory = arg0.getApplication().getExpressionFactory();
ValueExpression exp = expressionFactory.createValueExpression(arg0.getELContext(), parent, Object.class);
Object obj = exp.getValue(arg0.getELContext());
Digits d = null;
Field f = obj.getClass().getDeclaredField(field);
d = f.getAnnotation(Digits.class);
return super.getAsObject(arg0, arg1, arg2);
} catch (ConverterException e) {
FacesMessage msg = new FacesMessage(d.message());
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ConverterException(msg);
} catch (Exception e) {
return super.getAsObject(arg0, arg1, arg2);
}
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
return super.getAsString(arg0, arg1, arg2);
}
}
并且您需要在您的页面中使用该转换器:
<h:outputText value="#{someBean.someEntity.nome}" />
<h:form>
<p:inputText value="#{someBean.someEntity.someBigDecimal}" id="test">
<f:converter converterId="MyBigDecimalConverter" />
</p:inputText>
<h:message for="test"></h:message>
<p:commandButton value="teste" process="@form" update="@form"></p:commandButton>
</h:form>
我在这里使用 primeFaces 组件,但您并不真正需要它们。
转换器到底在做什么?它正在获取 bean 中的对象,该对象包含 inputText 引用的值和字段名称。然后,它找到该字段的 @Digits 注释并读取它的消息。它要求 NumericConverter 将字符串转换为数字。如果失败,它将使用@Digits 注释中的消息作为错误消息。
关于java - 为什么我的 bean 验证消息没有被接收到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9484163/
在 JSF2 应用程序中遇到验证属性的问题时,有两种主要方法。 使用 Annotation 在 ManagedBean 上定义验证 @ManagedBean public class MyBean {
我想实现一个不常见的功能,我认为 jquery 验证插件将是最好的方法(如果您在没有插件的情况下建议和回答,我们也会欢迎)。我想在用户在输入字段中输入正确的单词后立即隐藏表单。我试过这个: $("
我有几个下拉菜单(类名为month_dropdown),并且下拉菜单的数量不是恒定的。我怎样才能为它们实现 NotEqual 验证。我正在使用 jQuery 验证插件。 这就是我写的 - jQuery
我设法制作了这个网址验证代码并且它起作用了。但我面临着一个问题。我认为 stackoverflow 是获得解决方案的最佳场所。 function url_followers(){ var url=do
我目前正在使用后端服务,该服务允许用户在客户端应用程序上使用 Google Games 库登录。 用户可以通过他们的 gplay ID 向我们发送信息,以便登录或恢复旧帐户。用户向我们发送以下内容,包
我正在尝试验证输入以查看它是否是有效的 IP 地址(可能是部分地址)。 可接受的输入:172、172.112、172.112.113、172.112.113.114 Not Acceptable 输入
我从 Mongoose 验证中得到这条消息: 'Validator failed for path phone with value ``' 这不应该发生,因为不需要电话。 这是我的模型架构: var
我一直在尝试使用Python-LDAP (版本 2.4.19)在 MacOS X 10.9.5 和 Python 2.7.9 下 我想在调用 .start_tls_s() 后验证与给定 LDAP 服务
我正在处理一个仅与 IE6 兼容的旧 javascript 项目(抱歉...),我想仅在 VS 2017 中禁用此项目的 ESLint/CSLint/Javascript 验证/CSS 验证。 我知道
我正在寻找一种方法来验证 Spring 命令 bean 中的 java.lang.Double 字段的最大值和最小值(一个值必须位于给定的值范围之间),例如, public final class W
我正在尝试在 springfuse(JavaEE 6 + Spring Framework (针对 Jetty、Tomcat、JBoss 等)) 和 maven 的帮助下构建我的 webapps 工作
我试图在我们的项目中使用 scalaz 验证,但遇到了以下情况: def rate(username: String, params: Map[String, String]): Validation
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
我有一个表单,人们可以单击并向表单添加字段,并且我需要让它在单击时验证这些字段中的值。 假设我单击它两次并获取 2 个独立的字段集,我需要旋转 % 以确保它在保存时等于 100。 我已放入此函数以使其
在我的页面中有一个选项可以创建新的日期字段输入框。用户可以根据需要创建尽可能多的“截止日期”和“起始日期”框。就像, 日期_to1 || date_from1 日期到2 ||日期_from2 date
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
有没有办法在动态字段上使用 jquery 验证表单。 我想将其设置为必填字段 我正在使用 Jsp 动态创建表单字段。 喜欢 等等...... 我想使用必需的表单字段验证此表单字段。 最佳答
嗨,任何人都可以通过提供 JavaScript 代码来帮助我验证用户名文本框不应包含数字,它只能包含一个字符。 最佳答案 使用正则表达式: (\d)+ 如果找到匹配项,则字符串中就有一个数字。 关于J
我有两个输入字段holidayDate和Description(id=tags) $(document).ready(function() {
我遇到了这个问题,这些验证从电子邮件验证部分开始就停止工作。 我只是不明白为什么即使经过几天的观察,只是想知道是否有人可以在这里指出我的错误? Javascript部分: function valid
我是一名优秀的程序员,十分优秀!