更新(合并)时缺少Spring Data JPA验证

时间:2017-08-30 14:24:10

标签: java spring hibernate spring-data-jpa bean-validation

我正在使用带有Spring Data JPA的Spring boot 1.5.4.RELEASE进行项目。

问题是在更新实体时没有执行Hibernate验证器,或者至少在某些情况下它没有验证。

对于,如下所示,禁止使用空名称,技能收集必须包含最小1个元素和最多5个元素。 在Spring Data存储库上调用 save 期间验证它们。但是,对于已存在的实体的呼叫保存,它将仅验证名称的约束 - 并且不会检查技能。

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    @NotBlank
    private String name;

    @ElementCollection(fetch = FetchType.EAGER)
    @Size(min = 1, max = 5)
    private Set<String> skills = new HashSet<>();

    protected Person() {
    }

    public Person(final String name, final Collection<String> skills) {
    this.name = name;
    this.skills.addAll(skills);
    }

    public void updateSkills(Collection<String> skills) {
    this.skills.clear();
    this.skills.addAll(skills);
    }

    public void updateName(final String name) {
    this.name = name;
    }
    //getters
}

当创建具有空技能列表的新实体时,它将按预期抛出ConstraintValidationException:

@Test(expected = ConstraintViolationException.class)
public void shouldFailWhenSkillsAreEmpty() {
    //given
    Person person = new Person("gucio", Collections.EMPTY_LIST);
    //when
    personRepository.save(person);
    //then
}

https://github.com/konczak/demo-skills-validation-issue/blob/master/src/test/java/com/example/demo/entity/PersonTest.java#L80

然而,当做同样的事情 - 在实体更新中存储空列表(合并发动机舱?不确定)它会通过,而我会期望异常:

@Test(expected = ConstraintViolationException.class)
public void shouldFailWhenUpdateSkillsToEmpty() {
    //given
    Person person = new Person("gucio", Arrays.asList(JAVA, SQL));
    person = personRepository.save(person);
    person.updateSkills(Collections.EMPTY_LIST);
    //when
    personRepository.save(person);
    //then
}

https://github.com/konczak/demo-skills-validation-issue/blob/master/src/test/java/com/example/demo/entity/PersonTest.java#L104

我用手动创建的验证器编写了测试并验证了这样的Person,并且正如预期的那样,它为场技能返回1 ConstraintViolation:

https://github.com/konczak/demo-skills-validation-issue/blob/master/src/test/java/com/example/demo/entity/PersonTest.java#L119

您可以轻松查看示例项目:

https://github.com/konczak/demo-skills-validation-issue

我知道瞬态和附加/分离实体的保存方法存在差异,但我仍然希望验证更新/合并。 再次奇怪的是,它将在更新时验证字段名称的空白值 - 它会抛出不同的异常但原始原因是ConstraingViolationException。

https://github.com/konczak/demo-skills-validation-issue/blob/master/src/test/java/com/example/demo/entity/PersonTest.java#L91

在这种情况下我错过或误解了什么?

0 个答案:

没有答案