![](/img/trans.png)
[英]Spring application context reloading doesn't update bean registered by DelegatingFilterProxy
[英]Spring JPA doesn't validate bean on update
我正在使用Spring Boot 1.5.7,Spring JPA,Hibernate驗證,Spring Data REST,Spring HATEOAS。
我有一個像這樣的簡單bean:
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
@NotBlank
private String name;
}
如你所見,我正在使用@NotBlank。 根據Hibernate文檔,驗證應該在pre-persist和pre-update上進行。
我創建了一個junit測試:
@Test(expected = ConstraintViolationException.class)
public void saveWithEmptyNameThrowsException() {
Person person = new Person();
person.setName("");
personRepository.save(person);
}
此測試工作正常,因此驗證過程正確。 相反,在此測試用例中,驗證不起作用:
@Test(expected = ConstraintViolationException.class)
public void saveWithEmptyNameThrowsException() {
Person person = new Person();
person.setName("Name");
personRepository.save(person);
person.setName("");
personRepository.save(person);
}
我發現了另一個類似的問題,但遺憾的是沒有任何答復。 為什么不在update()方法上進行驗證? 建議解決問題?
我認為沒有發生ConstraintViolationException,因為在更新期間Hibernate不會在現場將結果刷新到數據庫。 嘗試使用saveAndFlush()替換測試save()。
你在使用Spring Boot JPA測試嗎? 如果是,則saveWithEmptyNameThrowsException
包含在事務中,並且在方法執行完成之前不會提交。 換句話說,該方法被視為一個工作單元。 調用personRepository.save
(除非啟用自動提交/刷新更改)將不會求助於實體更改的反映,而是在提交事務之前。 以下是測試的解決方法:
@Test(expected = ConstraintViolationException.class)
public void saveWithEmptyNameThrowsException() {
// Wrap the following into another transaction
// begin
Person person = new Person();
person.setName("Name");
personRepository.save(person);
// commit
// Wrap the following into another transaction
// begin
person = ... get from persistence context
person.setName("");
personRepository.save(person);
// commit
}
您可以在Spring中使用TransactionTemplate
進行編程事務划分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.