我有一个简单的JSF + RichFaces表单,有一些字段,显然是一个支持bean来存储它们.在那个bean中,所有必需的属性都有验证注释(jsr303/hibernate),但我似乎无法找到一个注释来检查属性(String)是否为空.我知道spring模块中有@NotBlank注释,但JSF不支持spring验证.有没有简单的方法来检查它,还是我应该编写自己的注释?
@Edit:我已经尝试过来自jsr303和hibernate的@NotNull和@NotEmpty,但是他们都失败了我仍然可以发送一个像""这样的空白字符串.
我正在使用JSF 2.0和Glassfish v3.我正在测试JSR303 bean验证的功能,所以我创建了一个验证器,它实现ConstraintValidator然后在我要验证的属性上注释它.
它工作正常,但它显示Glassfish默认错误页面.我不希望这个显示,我宁愿把消息显示在一个<h:outputText>或什么的.
有谁知道如何实现这一目标?
这是我的验证方法:
@Override
public boolean isValid(String searchArg, ConstraintValidatorContext ctx) {
boolean searchArgCorrect = true;
FacesMessage msg;
if(searchArg!=null) {
ctx.disableDefaultConstraintViolation();
if(searchArg.length() < 3) {
ctx.buildConstraintViolationWithTemplate("Searcharg is too short").addConstraintViolation();
searchArgCorrect=false;
msg = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"Searcharg is too short", null);
throw new ValidatorException(msg);
}
}
return searchArgCorrect;
}
Run Code Online (Sandbox Code Playgroud)
PS:我知道有更简单的方法来验证字符串的长度,但上面的代码片段仅用于演示/测试目的.我有另一个验证器的计划.
经过几个小时的谷歌和一些教程,我被打败了...事实并非我得到错误可以给我提示问题是什么,完全没有它们让我疯了!
以下代码有效,只是不应该!检查输入不是null或小于3个字符长的注释永远不会运行.在部署项目或写入名称变量时,它们也不会发出任何错误.
public class testBean
{
@NotNull
@Size(min=3)
private String name;
}
public void test()
{
System.out.println(name);
}
Run Code Online (Sandbox Code Playgroud)
输入表格:
<h:form>
<h:inputText value="#{testBean.name}" />
<h:commandButton value="Send" action="#{testBean.test()}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
我的猜测是,这是导致问题的tomcat,虽然我很确定我已经导入了所有必要的库.对于我正在使用的IDE,Eclipse也是如此.
我正在使用Spring 3.1并使用以下spring配置,我LocalValidatorFactoryBean使用自己的显式创建ValidationMessageSource.我的类路径中有Hibernate Validator 4.1.
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>ValidatorMsgID</value>
</list>
</property>
</bean>
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
Run Code Online (Sandbox Code Playgroud)
但是我注意到,LocalValidatorFactoryBean通过在类afterPropertiesSet方法中调试调试来创建两次.第一次是我在spring配置中定义的explicite bean,但是随后同一个类被类隐式重新实例化DefaultListableBeanFactory- 显然这次没有validationMessageSource.因此,当Spring确实使用LocalValidatorFactoryBean默认Hibernates messagesource而不是我指定的那个时使用它.
好吧,进一步研究它似乎这是由mvc:annotation-driven我在spring配置中引起的.任何指针仍然会有所帮助
我的应用程序在这里遇到了一些问题.我想检查字段密码和确认密码是否匹配在一起,所以我尝试在这个问题的第一个答案中这样做:使用Hibernate Validator进行交叉字段验证(JSR 303)
问题是它实际上不起作用,我没有想法为什么.请帮我!这是我在这里的第一篇文章,所以请不要对我太苛刻.
这是我的注释:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints;
import java.lang.annotation.*;
import javax.validation.Constraint;
import javax.validation.Payload;
/**
*
* @author lukasz
*/
@Documented
@Constraint(validatedBy = FieldMatchValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldMatch {
String message() default "{pl.lodz.p.zsk.ssbd2012.ssbd12.ValidationConstraints.FieldMatch}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String first();
String second();
}
Run Code Online (Sandbox Code Playgroud)
这是我的ValidatorClass:
/*
* To change this template, choose Tools | Templates
* …Run Code Online (Sandbox Code Playgroud) validation hibernate-validator bean-validation jsf-2 managed-bean
我一直在尝试Vaadin 7.首先,我必须管理我在Vaadin安静的一个菜鸟并且对JAVA持久性不太熟悉.因此,我正在尝试学习bean验证以及如何使用它.我已经按照几个教程,但很难确定哪个是Vaadin 7的最新和正确的.尽管如此,我尝试下载并使用JPA容器和BeanValidator,我无法让它工作.这是我正在使用的代码:
package com.example.firstvaadin;
import java.io.Serializable;
import org.hibernate.validator.constraints.Email;
import javax.validation.constraints.*;
public class RegisterBean implements Serializable{
public RegisterBean(String email){
this.email = email;
}
@Size(min = 5, max = 50)
private String email;
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
}
Run Code Online (Sandbox Code Playgroud)
和
RegisterBean rbean = new RegisterBean("");
BeanItem<RegisterBean> item = new BeanItem<RegisterBean>(rbean);
TextField email = new TextField("email",item.getItemProperty("email"));
email.setImmediate(true);
layout.addComponent(email);
email.setNullRepresentation("");
Run Code Online (Sandbox Code Playgroud)
但是我在下面的代码中遇到了运行时异常:email.addValidator(new BeanValidator(RegisterBean.class,"email"));
The exception is:
aused by: com.vaadin.event.ListenerMethod$MethodException: Invocation of method buttonClick …Run Code Online (Sandbox Code Playgroud) 假设我有一个带有文本字段的表,名为player,它是null.所以允许空值,但如果不是null(有一个值),文本/字符串的大小必须在10到100之间.我有这个开始:
@Column(name = "player", nullable = true)
@Size(min = 5, max = 100)
private String player;
Run Code Online (Sandbox Code Playgroud)
但是当将字段设置为null时,JSF页面会抛出验证错误.
有没有办法让Size验证器忽略空值?
我将 Vaadin 14 与 Vaadin CRUD AddOns 一起使用,但我的验证似乎对我不起作用。
如果我打开我的 CRUD 视图并查看这两个字段。它们是空字符串,例如 null。我想收到一个错误“不能为空”。但在这里,我完全没有错误。
我的实体看起来像这样。
@Entity(name = "Data")
@Data
public class Data {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotNull
private String OrderNumber;
@NotNull
private String SerialNumber;
Run Code Online (Sandbox Code Playgroud)
如果我尝试保存到我的数据库,它看起来像这样。
Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [se.danielmartensson.entities.LX_Data] during update time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='must not be null', propertyPath=SerialNumber, rootBeanClass=class se.danielmartensson.entities.Data, messageTemplate='{javax.validation.constraints.NotNull.message}'}
ConstraintViolationImpl{interpolatedMessage='must not be null', propertyPath=OrderNumber, rootBeanClass=class se.danielmartensson.entities.Data, messageTemplate='{javax.validation.constraints.NotNull.message}'}
]
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为我的pom.xml已经Spring Boot Starter Validation …