0

我有一个简单的 JSF+RichFaces 表单,其中包含一些字段,显然还有一个支持 bean 来存储它们。在该 bean 中,所有必要的属性都有验证注释(jsr303/hibernate),但我似乎找不到一个注释来检查属性(字符串)是否为空。我知道 spring 模块中有一个 @NotBlank 注释,但是 JSF 不支持 spring 验证。有什么简单的方法可以检查它还是我应该写自己的注释?

@Edit:我已经尝试过来自 jsr303 和 hibernate 的 @NotNull 和 @NotEmpty,但是它们都失败了,我仍然可以发送像“”这样的空白字符串。

4

3 回答 3

9

如果您使用 Hibernate Validator 4.1 作为您的 JSR-303 实现,它们会提供一个@NotBlank注释,它完全符合您的要求,与 @NotNull 和 @NotEmpty 分开。您需要使用(当前)最新版本,但这会起作用。

如果你因为某种原因不能去最新的版本,自己写一个注解也没什么大不了的。

于 2010-07-16T14:07:32.203 回答
1

Hibernate Validator 4.1+ 提供了一个自定义的纯字符串注解,在修剪空白后@NotBlank检查 not null 和 not empty 。状态的 api 文档: @NotBlank

NotEmpty 的不同之处在于尾随空格被忽略。

If this isn't clear that @NotEmpty is trimming the String before the check, first see the description given in the 4.1 document under the table 'built-in constaints':

Check that the annotated string is not null and the trimmed length is greater than 0. The difference to @NotEmpty is that this constraint can only be applied on strings and that trailing whitespaces are ignored.

Then, browse the code and you'll see that @NotBlank is defined as:

@Documented
@Constraint(validatedBy=NotBlankValidator.class)
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
@Retention(value=RUNTIME)
@NotNull
public @interface NotBlank{
  /* ommited */
}

There are two things to note in this definition. The first is that the definition of @NotBlank includes @NotNull, so it's an extension of @NotNull. The second is that it extends @NotNull by using an @Constraint with NotBlankValidator.class. This class has an isValid method which is:

public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
  if ( charSequence == null ) { //this is curious
    return true;
  }
    return charSequence.toString().trim().length() > 0; //dat trim
}

Interestingly, this method returns true if the string is null, but false if and only if the length of the trimmed string is 0. It's ok that it returns true if it's null because, as I mentioned, the @NotEmpty definition also requires @NotNull.

于 2013-06-16T19:16:17.357 回答
0

也许@NotEmpty

其定义为:

@NotNull
@Size(min=1)

由于您使用的是richfaces,我猜您正在使用<rich:beanValidator />?它处理 JSR 303 注释。

更新:尝试(取自此处):

@Pattern(regex="(?!^[\s]*$)"). 
于 2010-07-16T13:57:38.193 回答