![](/img/trans.png)
[英]handling the javax.validation.ConstraintViolationException in spring boot
[英]Validation in Spring Data throws ConstraintViolationException
我正在嘗試根據 Spring 數據對我的服務實施驗證。 在線文檔說,我只需要javax.validation
的注釋,一切都應該正常。 我的意思是,如果驗證失敗,它會拋出一個可以被捕獲和處理的MethodArgumentNotValidException
(這應該是 spring 通過魔法完成的)。
但是,我無法在我的項目中實現這一點,每當我實施驗證時,就會拋出TransactionSystemException
中的ConstraintViolationException
。
這是一個最小的例子:
實體:
@Entity
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Foo {
@Id
UUID id = UUID.randomUUID();
@NotBlank
String name;
}
存儲庫:
public interface FooRepository extends PagingAndSortingRepository<Foo, UUID> {
}
Controller:
@RepositoryRestController
public class FooController {
@Autowired
FooRepository fooRepository;
@PostMapping(value = "/foos", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaTypes.HAL_JSON_VALUE})
public @ResponseBody ResponseEntity<?> postFoo(HttpServletRequest request, @Valid @RequestBody Foo foo,
PersistentEntityResourceAssembler resourceAssembler) {
Foo savedFoo = fooRepository.save(foo);
return new ResponseEntity<>(resourceAssembler.toFullResource(savedFoo), HttpStatus.CREATED);
}
}
以及我運行代碼的測試代碼:
@SpringBootTest
@AutoConfigureMockMvc(addFilters = false)
@AutoConfigureDataJpa
class FooTest {
@Autowired
MockMvc mockMvc;
@Test
void testPost() throws Exception {
Foo foo = new Foo();
assertNull(foo.getName());
mockMvc.perform(
post("/foos")
.contentType(MediaType.APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(foo)))
.andDo(print())
.andExpect(status().isBadRequest());
}
}
拋出的異常如下:
Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [Foo] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='darf nicht leer sein', propertyPath=name, rootBeanClass=class Foo, messageTemplate='{javax.validation.constraints.NotBlank.message}'}
]
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:140)
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:80)
at org.hibernate.action.internal.EntityInsertAction.preInsert(EntityInsertAction.java:227)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:100)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)
ConstraintViolationException 與驗證無關。 這是因為每次調用測試方法 testPost() 時,您都在保存相同的 foo object。 每次保存 foo 時都使用不同的 ID。 Id 是主鍵,如果您保存多個 object 具有相同的 id 或主鍵,您將得到 ConstraintViolationException。
我現在找到了解決方案,但我還沒有真正理解它。 我將進一步調查並在這里分享我的結果,如果有人可以向我解釋,請隨時發表評論。
我通過用@RestController
而不是@RepositoryRestController
注釋我的 Controller 來解決它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.