【问题标题】:Bean validation not working?Bean验证不起作用?
【发布时间】: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


【解决方案1】:

根据您的示例,您正在使用 Hibernate Validator 4.0.2.GA 和 Bean Validation 1.1.0.Final。那是行不通的。要使用 Bean Validation 1.1,您需要 Hibernate Validator 5.x(5.1.2.Final 是最新的)。我希望您的示例甚至没有正确引导或至少吃日志中有一些警告。

【讨论】:

  • 我用5.1.2.Final试过了,但还是一样
  • @daydreamer 我有类似的问题。你想清楚了吗?
  • 不。这是一个很老的问题,我不记得了
猜你喜欢
  • 2015-04-20
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多