2017-12-15 33 views
0

カスタムバリデーターにエンティティリポジトリを挿入できません。 私は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) 

をスローテスト? BuildingFloorUnicityValidatorCheckは、春の豆ではありません、あなたが@Service@Componentとそれに注釈を付けたり@Configuration注釈付きクラスから、それをインスタンス化する必要がありますので、

答えて

0

@Autowiredは春で解釈することはできません。

ちなみに、JHipsterとSpringは、フィールドインジェクション(あなたが使ったもの)よりコンストラクタインジェクションを優先します。 JHipsterのすべてのサービスではこのようにしていますので、プロジェクトで多くの例が見つかります。

+0

私はそれを試みましたが、 '@Service'アノテーションでは機能しませんでした。コンストラクタの方法で' @ Autowired'の方法とトリガエラーでまだヌルです。 'javax.validation.ValidationException:HV000064:ConstraintValidatorをインスタンス化できません:class eu。***。master_data.validator.location.LocationBuildingIntegrityValidatorCheck。 \t at org.hibernate.validator.internal.util.privilegedactions.NewInstance.run(NewInstance.java:42)... ' – jona303

+0

これは、元のexempleと同じバリデータではありませんが、同じ構造です。 – jona303