簡體   English   中英

Spring數據中驗證拋出ConstraintViolationException

[英]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 來解決它。

https://jira.spring.io/browse/DATAREST-593

這個靈魂對我有用:https://stackoverflow.com/a/44304198/4567795

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM