当前位置: 首页 > 知识库问答 >
问题:

Java约束验证-未触发验证

楚建柏
2023-03-14

我计划使用javax验证API中的ConstraintValidation

波姆。xml

<dependency>
      <groupId>javax.el</groupId>
      <artifactId>javax.el-api</artifactId>
      <version>3.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>javax.el</artifactId>
      <version>2.2.6</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.2.Final</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator-annotation-processor</artifactId>
      <version>6.0.2.Final</version>
    </dependency>
    <dependency>
      <groupId>javax.validation</groupId>
      <artifactId>validation-api</artifactId>
      <version>2.0.0.Final</version>
    </dependency>

位置检查。JAVA

@Constraint(validatedBy = PositionValidator.class)
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PositionCheck {
    String message() default "Invalid position.";

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

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

位置验证器。JAVA

public class PositionValidator implements ConstraintValidator<PositionCheck, Position> {
    public void initialize(PositionCheck positionCheck) {
        System.out.println(positionCheck);
    }

    public boolean isValid(Position position, ConstraintValidatorContext constraintValidatorContext) {
        return position.getX() > 0
                && position.getY() > 0
                && position.getX() < BOARD_X_SIZE
                && position.getY() < BOARD_Y_SIZE;
    }
}

位置JAVA

// Generates all the getter methods
@Getter(AccessLevel.PUBLIC)

// Generate all the setter methods
@Setter(AccessLevel.PUBLIC)

// Generates an all argument constructor
@AllArgsConstructor(access = AccessLevel.PUBLIC)

// Overrides the default toString() method
@ToString(callSuper = true, includeFieldNames = true)

// Overriding equals() and hashCode() methods, to check the equality
@EqualsAndHashCode
public class Position {

    // position on the x-axis
    private Integer x;

    // position on the y-axis
    private Integer y;

    // direction indicates, what direction robot is facing
    // possible values are NORTH, SOUTH, EAST or WEST
    private Direction direction;
}

机器人。JAVA

@Getter @Setter(AccessLevel.PUBLIC)
@NoArgsConstructor(access = AccessLevel.PUBLIC)

public class Robo implements IRobo {


    @PositionCheck
    private Position currentPosition;

    public void left() {

    }

    public void move() {

    }

    @SneakyThrows(InvalidPositionException.class)
    public void place(Position position) {
        if(position == null) {
            throw new InvalidPositionException("To place robo on TableTop, position cannot be null");
        }

        this.setCurrentPosition(new Position(position.getX(), position.getY(), position.getDirection()));
    }

    public void report() {

    }

    public void right() {

    }
}

一个pp.java

public class App 
{
    public static void main( String[] args ) {
        Robo robo = new Robo();
        Position position = new Position(0,6, Direction.NORTH);
        robo.setCurrentPosition(position);
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<Position>> constraintViolations = validator.validate(position);
        for (ConstraintViolation<Position> constraint : constraintViolations) {
            System.out.println(constraint.getPropertyPath() + "  "
                    + constraint.getMessage());
        }
    }
}

这里的问题是,PositionCheckValidator上的isValid()。我错过了什么?


共有1个答案

章岳
2023-03-14

您正在验证位置。

注释@PositionCheck位于robocurrentPosition字段中。验证robo,然后将调用验证程序。

 类似资料:
  • 我有一个像下面这样的模型对象,带有自定义约束验证器。自定义验证器检查是否填充了fileName或小时。 有一种方法将此作为输入,它验证所有以下条件 > 条件不为空(通过默认验证器) criteria.id不为空(通过默认验证器) criteria.name不为空(通过默认验证器) 标准文件名或小时不为空(通过自定义验证器) 空评估(@NotNull@有效标准标准){} 现在,当我为这个模型类编写单

  • 我有以下验证器,用于验证更新请求。 object.getIdCreditor()有一个值,但是findById方法的执行["CreditorRepository.findById(object.getIdCreditor())" ] 进入NullPointer异常 我不明白怎么了。

  • 在本教程中,你将学习如何在 Sequelize 中设置模型的验证和约束. 对于本教程,将假定以下设置: const { Sequelize, Op, Model, DataTypes } = require("sequelize"); const sequelize = new Sequelize("sqlite::memory:"); const User = sequelize.define

  • 为了在将表单提交到服务器之前验证数据,HTML5 新增了一些功能。有了这些功能,即便JavaScript被禁用或者由于种种原因未能加载,也可以确保基本的验证。换句话说,浏览器自己会根据标记中的规则执行验证,然后自己显示适当的错误消息(完全不用JavaScript 插手)。当然,这个功能只有在支持HTML5 这部分内容的浏览器中才有效,这些浏览器有Firefox 4+、Safari 5+、Chrom

  • 我想通过使用Spring Boot和Hibernate Validator进行字段验证,而不保存数据。

  • 每个人 因此,我有一个SpringBoot应用程序,它带有一个控制器,该控制器有几种方法,将以下POJO作为参数: 对于其中一个控制器endpoint,我想应用额外的验证逻辑,因此在我添加了以下内容: 是我想要应用的约束注释。 我的问题是,只有在中定义的检查成功通过时,才会调用此附加约束。如果为空,约束将被忽略,客户端将收到不完整的验证结果。我错过了什么?