验证正整数

时间:2012-02-15 12:15:40

标签: java bean-validation

我想只允许数字字段的正整数,包括零。如何使用JSR 303定义此验证。
我试过了

  1. @Min(value=0 message = "msg1") - 但它允许浮点值,如1.2。

  2. @Digits(fraction = 0, integer = 10, message ="msg2") - 它接受负值。

  3. @Min(value=0, message = "msg1" )
    @Digits(fraction = 0, integer = 10, message ="msg2") - 工作正常,但有时会显示msg1msg2这两个消息。

  4. 有什么建议吗?

    谢谢!

9 个答案:

答案 0 :(得分:29)

只需在bean中使用注释@Min

@Min(value = 0L, message = "The value must be positive")
private Double value;

答案 1 :(得分:15)

看起来您正在寻找自然数字,我认为您可以使用正则表达式模式来获得所需的输出。像

这样的东西

@Pattern(regexp = "[\\s]*[0-9]*[1-9]+",message="msg")

答案 2 :(得分:3)

如果您使用hibernate-validator,那么您可以使用@Min创建一个自定义约束,该约束通过第3个选项合并@Digits@ConstraintComposition(AND)。如果您要添加@ReportAsSingleViolation,则只会显示自定义消息。

答案 3 :(得分:1)

最好使用下面的范围注释作为正数

@Range(min = 0l, message = "Please select positive numbers Only")

对于负数

@Range(min = -9223372036854775808l, max = 0l, message = "Please select Negative numbers Only")

答案 4 :(得分:0)

这是上面答案https://stackoverflow.com/a/41675990/258544中的示例代码

@Documented
@Min(value=0, message = "add a min msg" )
@Digits(fraction = 0, integer = 10, message ="add a digit msg")
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
@ReportAsSingleViolation
public @interface NumberFormatValidator {

    String message() default "invalid number";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

它使用约束组合http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html_single/#validator-customconstraints-compound@ReportAsSingleViolation来避免同时播放两条消息

答案 5 :(得分:0)

将字段的数据时间从int更改为Integer,并使用message.properties文件将其设置为消息

示例:假设您的fieldName是 myNumericField ,并且属于一个名为 Test

的类
  1. 更改数据类型:

    • 更改 private int myNumericField; private Integer myNumericField;

    • 更新getter和setter以使用/返回Integer

  2. 创建定制的message.properties文件。 这看起来似乎需要更多工作,但它是一种更优雅,更可扩展的解决方案,而不是将消息硬编码在注释中

    • 资源目录

    • 下创建 message.properties 文件
    • 编辑 messages.properties 并添加以下行

    typeMismatch.Test.myNumericField=Please use integers only

    记住要为您的类和字段名称更改 Test myNumericField

    • 编辑您的Application Context xml文件,并在<\ beans>标记之前添加以下标记

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames" value="resources/messages" /> </bean>

答案 6 :(得分:0)

另一种解决方案,以我个人的观点,它更干净,更易于阅读。

@Positive
@Digits(integer = 5, fraction = 0)

答案 7 :(得分:0)

使用以下组合为我解决了这个问题:

  @NotNull
  @Range(min = 1)
  @JsonProperty("end_range")
  private Integer endRange;

请确保使用Integer类而不是int来使@NotNull正常工作。

答案 8 :(得分:0)

如果您可以将其更改为BigInteger,则可以使用@Positive注释

更新:@Positive也适用于int及其包装器(即Integer)