【问题标题】:Dependency injection in validator验证器中的依赖注入
【发布时间】:2017-12-15 12:04:17
【问题描述】:

我无法在自定义验证器中注入实体存储库。 我对 java、spring 和 jHipster 还很陌生,所以我对类似问题的答案有点迷茫。

我有什么:

一个实体:

@Entity
@Table(name = "building_floor",uniqueConstraints = @UniqueConstraint(name="buildingFloor",columnNames = {"building_id","name"}))
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@BuildingFloorUnicityValidator
public class BuildingFloor implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Size(max = 32)
    @Column(name = "name", length = 32, nullable = false)
    private String name;

    @ManyToOne
    @NotNull
    private Building building;
    //...

自定义注释:

@Documented
@Constraint(validatedBy = BuildingFloorUnicityValidatorCheck.class)
@Target({ ElementType.TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
public @interface BuildingFloorUnicityValidator {

    String message() default "{builindg floor already exists}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    String value() default "";
}

验证器:

public class BuildingFloorUnicityValidatorCheck implements ConstraintValidator<BuildingFloorUnicityValidator, BuildingFloor> {

    @Autowired
    private BuildingFloorRepository buildingFloorRepository;



    @Override
    public void initialize(BuildingFloorUnicityValidator constraintAnnotation) {

    }

    @Override
    public boolean isValid(BuildingFloor value, ConstraintValidatorContext context) {
        BuildingFloor existingBuilindg = buildingFloorRepository.findOneByBuildingAndName(value.getBuilding(),value.getName());

        return existingBuilindg == null;
    }
}

在我的控制器中:

@PostMapping("/building-floors")
    @Timed
    public ResponseEntity<BuildingFloorDTO> createBuildingFloor(@Valid @RequestBody BuildingFloorDTO buildingFloorDTO)

所以当我启动测试时,验证器中的存储库会抛出 NullPointerException

Caused by: java.lang.NullPointerException: null
    at eu.***.master_data.validator.unicity.BuildingFloorUnicityValidatorCheck.isValid(BuildingFloorUnicityValidatorCheck.java:31)

我错过了什么?

【问题讨论】:

    标签: java validation spring-boot jhipster


    【解决方案1】:

    @Autowired 不能被 Spring 解释,因为 BuildingFloorUnicityValidatorCheck 不是 Spring bean,您必须使用 @Service@Component 对其进行注释,或者从 @Configuration 注释类中实例化它。

    顺便说一下,JHipster 和 Spring 更喜欢构造函数注入而不是字段注入(您使用的)。 JHipster 中的所有服务都使用这种方式,因此您会在项目中找到很多示例。

    【讨论】:

    • 我试过了,但它不适用于@Service 注释它在@Autowired 方式中仍然为空,并在构造函数方式中触发错误。 javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class eu.***.master_data.validator.location.LocationBuildingIntegrityValidatorCheck. at org.hibernate.validator.internal.util.privilegedactions.NewInstance.run(NewInstance.java:42)...
    • 它与原始示例中的验证器不同,但结构相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多