Java Spring数据中的验证引发ConstraintViolationException

Java Spring数据中的验证引发ConstraintViolationException,java,spring,spring-data,Java,Spring,Spring Data,我正在尝试基于Spring数据对我的服务进行验证。在线文档说,我只需要javax.validation的注释,一切正常。 很好,我的意思是,如果验证失败,它会抛出一个MethodArgumentNotValidException,可以捕获和处理它(spring应该用魔法实现) 然而,我无法在我的项目中实现这一点,每当我实现验证时,就会在TransactionSystemException中抛出一个ConstraintViolationException 下面是一个简单的例子: 实体: @实体 @

我正在尝试基于Spring数据对我的服务进行验证。在线文档说,我只需要
javax.validation
的注释,一切正常。 很好,我的意思是,如果验证失败,它会抛出一个
MethodArgumentNotValidException
,可以捕获和处理它(spring应该用魔法实现)

然而,我无法在我的项目中实现这一点,每当我实现验证时,就会在
TransactionSystemException中抛出一个
ConstraintViolationException

下面是一个简单的例子:

实体:

@实体
@资料
@NoArgsConstructor(access=AccessLevel.PROTECTED)
公开课Foo{
@身份证
UUID id=UUID.randomuid();
@不空白
字符串名;
}
存储库:

公共接口FooRepository扩展了分页和排序存储库{
}
控制器:

@RepositoryRestController
公共类FooController{
@自动连线
食物知识库;
@PostMapping(value=“/foos”,consumes={MediaType.APPLICATION\u JSON\u value,MediaTypes.HAL\u JSON\u value})
public@ResponseBody ResponseEntity postFoo(HttpServletRequest请求,@Valid@RequestBody Foo Foo,
PersistentEntityResourcesAssembler(资源汇编程序){
Foo savedFoo=foosrepository.save(Foo);
返回新的ResponseEntity(resourceAssembler.toFullResource(savedFoo),HttpStatus.CREATED);
}
}
以及运行代码时使用的测试代码:

@SpringBootTest
@自动配置emockmvc(addFilters=false)
@自动配置TAJPA
足部阶级{
@自动连线
MockMvc-MockMvc;
@试验
void testPost()引发异常{
Foo-Foo=新的Foo();
assertNull(foo.getName());
mockMvc.perform(
邮政(“/foos”)
.contentType(MediaType.APPLICATION_JSON)
.content(新的ObjectMapper().writeValueAsString(foo)))
.andDo(print())
.andExpect(status().isBadRequest());
}
}
引发的异常如下所示:

原因:javax.validation.ConstraintViolationException:在组[javax.validation.groups.Default]的持续时间内,类[Foo]的验证失败,]
约束冲突列表:[
ConstraintViolationImpl{interpolatedMessage='darf nicht leer sein',propertyPath=name,rootBeanClass=class Foo,messageTemplate='{javax.validation.constraints.NotBlank.message}}
]
位于org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:140)
位于org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:80)
位于org.hibernate.action.internal.EntityInsertAction.preInsert(EntityInsertAction.java:227)
位于org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:100)
位于org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
位于org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)

ConstraintViolationException与验证无关。这是因为每次调用测试方法testPost()时都保存相同的foo对象。每次保存foo时,请使用不同的id。id是主键,如果保存多个具有相同id或主键的对象,您将获得ConstraintViolationException。

我现在找到了一个解决方案,但我还没有真正理解它。我将对此进行进一步调查,并在这里分享我的结果,如果有人能向我解释,请随意评论

我用
@RestController
而不是
@RepositoryRestController
来注释我的控制器,从而解决了这个问题


此解决方案对我有效:

ConstraintViolationException可能由于其他原因发生,例如在非空列中插入
null
。是的,这是正确的,可能有许多其他原因。但在本例中,由于正在使用验证,它不能为null。在本例中,异常是由字段
name
引起的。我将用有关异常的更多信息编辑我的问题。