Java 验证器中的依赖注入
我无法在自定义验证器中注入实体存储库。 我对java、spring和jHipster还很陌生,所以我对类似问题的答案有点迷茫 我所拥有的: 实体:Java 验证器中的依赖注入,java,validation,spring-boot,jhipster,Java,Validation,Spring Boot,Jhipster,我无法在自定义验证器中注入实体存储库。 我对java、spring和jHipster还很陌生,所以我对类似问题的答案有点迷茫 我所拥有的: 实体: @Entity @Table(name = "building_floor",uniqueConstraints = @UniqueConstraint(name="buildingFloor",columnNames = {"building_id","name"})) @Cache(usage = CacheConcurrencyStrategy
@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 "";
}
我缺少什么?
@Autowired
不能由Spring解释,因为buildingFloorRunicityValidatorCheck
不是Springbean,您必须使用@Service
或@Component
对其进行注释,或者从@Configuration
注释类对其进行实例化
顺便说一下,JHipster和Spring更喜欢构造函数注入而不是字段注入(您使用的)。JHipster中的所有服务都使用这种方式,因此您可以在您的项目中找到许多示例。我尝试了这种方式,但它不适用于
@Service
注释它在@Autowired
方式中仍然为空,并在构造函数方式中触发错误<代码>javax.validation.ValidationException:HV000064:无法实例化ConstraintValidator:类eu.***.master_data.validator.location.LocationBuildingIntegrityValidatorCheck。位于org.hibernate.validator.internal.util.privilegedactions.NewInstance.run(NewInstance.java:42)代码>它与原始示例中的验证器不同,但它的结构相同。
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)
Caused by: java.lang.NullPointerException: null
at eu.***.master_data.validator.unicity.BuildingFloorUnicityValidatorCheck.isValid(BuildingFloorUnicityValidatorCheck.java:31)