【发布时间】:2023-03-04 07:58:07
【问题描述】:
我有一个services 模块,ClientRequest 类为
public class ClientRequest {
@NotNull(message = "email can not be empty")
private String email;
@NotNull(message = "userExternalId can not be empty")
private String userExternalId;
@NotNull(message = "password can not be empty")
private String password;
@SuppressWarnings("UnusedDeclaration")
public ClientRequest() {
// used by jax-rs
}
services/pom.xml有
<properties>
<validation-api.version>1.1.0.Final</validation-api.version>
</properties>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>${validation-api.version}</version>
</dependency>
我有 integration 用于编写集成测试的模块。
integration/pom.xml 看起来像
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.0.2.GA</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-api.version}</version>
<scope>test</scope>
</dependency>
我的测试看起来像
@Test
public void testRegisterClientInValid() throws IOException {
final Client client = ClientBuilder.newClient();
final Invocation.Builder request = client.target("http://localhost:9090/application/oauth/register").request(MediaType.APPLICATION_JSON);
final Map<String, String> parameters = new HashMap<>();
parameters.put("email", "integrationTest@gmail.com");
final Response response = request.post(Entity.entity(parameters, MediaType.APPLICATION_JSON));
assertEquals(HttpStatus.SC_OK, response.getStatus());
final JsonNode jsonReply = getObjectMapper().readTree(response.readEntity(String.class));
System.out.println(jsonReply);
}
由于我预计它会因bean validation 而失败,所以我看到了日志要说的内容。
我明白了
[INFO] [talledLocalContainer] Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
[INFO] [talledLocalContainer] at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:129) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:190) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3124) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3587) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:103) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:453) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:345) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1218) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:421) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
[INFO] [talledLocalContainer] at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:110) [hibernate-core-4.3.1.Final.jar:4.3.1.Final]
这意味着 bean validation 已通过,错误在数据库层,因为数据库需要 not null 值
问题
为什么bean验证不起作用,我在这里做错了什么?
【问题讨论】:
-
你有没有想过这个问题?我也面临同样的问题。
-
@mad_fox,抱歉我不记得了
标签: java validation jakarta-ee jboss bean-validation