【问题标题】:Validate data fails with Play2.2.0 and Ebean使用 Play2.2.0 和 Ebean 验证数据失败
【发布时间】:2013-10-11 21:59:30
【问题描述】:

我正在使用 Play 2.2.0 和 Ebean 开发应用程序。 通过代码直接创建实体时出现问题,而不是使用表单。假设这是我的实体:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

import models.SuperEntity;

import com.avaje.ebean.validation.Length;

@Entity
@Table(name = "foos")
public class Foo extends SuperEntity {

    @Column(unique = true)
    @NotNull
    @Length(min = 2, max = 2)
    public String code;

}

这是我的单元测试:

@Test
public void testCreate() {
    running(fakeApplication(), new Runnable() {
        @Override
        public void run() {
            Foo foo = new Foo();
            foo.code = "foo1";
            foo.save();
        }
    });
}

问题是验证注释似乎被完全忽略了。如果我将代码设置为 null,我会遇到数据库错误而不是 Play 错误。

[error] Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'name' cannot be null
[error]     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[error]     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
[error]     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
[error]     at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
[error]     at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
[error]     at com.mysql.jdbc.Util.getInstance(Util.java:386)
[error]     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1041)
[error]     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4190)
[error]     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4122)
[error]     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
[error]     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
[error]     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2818)
[error]     at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2157)
[error]     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2460)
[error]     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2377)
[error]     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2361)
[error]     at com.jolbox.bonecp.PreparedStatementHandle.executeUpdate(PreparedStatementHandle.java:205)
[error]     at com.avaje.ebeaninternal.server.type.DataBind.executeUpdate(DataBind.java:55)
[error]     at com.avaje.ebeaninternal.server.persist.dml.InsertHandler.execute(InsertHandler.java:134)
[error]     at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:86)

@Length 注释也被忽略,我可以将我想要的长度放入数据库中。数据库中的列应该是varchar(2),它是varchar(255)。

我该如何解决这个问题?提前致谢。

编辑:我在使用 @Min、@Max 等 Long 或 Integer 属性的注释时遇到相同的错误...

【问题讨论】:

    标签: mysql validation ebean playframework-2.2


    【解决方案1】:

    Ebean 不会在保存时验证数据。 @NotNull@Column(unique = true) 等验证注释在 DDL 生成期间用于指定表约束。关于@Length 注释,Ebean 可能不支持此功能,但我无法确定文档。文档绝对是 Ebean 的一个问题。有一个discussion on the Play git repo 关于 Ebean with Play 的未来。它包括有关 Ebean 的新/积极开发的信息。

    【讨论】:

      【解决方案2】:

      javax.validation 未在 Ebean 中实现。请参阅com.avaje.ebean.validation 包,但我建议您不要使用它。

      【讨论】:

      • 是的,这就是我所做的,Ebean 真的很不稳定并且有奇怪的行为......我最终删除了所有 Ebean 注释,我用 javax.validation 替换它们并在必要时创建了自定义注释(@Range , @LengthInterval...) 因为我不能指望 Ebean 在保存之前验证数据(不知道为什么),所以我自己通过从 Play Validation factory 获取验证器来完成。然后我得到了一组 ConstraintViolation,我可以将它与适当的验证消息一起发回给用户。我仍然不明白 Ebean 是如何嵌入到 Play 中的,一个一年没有更新的网站......
      • 据我所知,Play 2.3 将不再包含 Ebean。它将被一些新的游戏所取代
      猜你喜欢
      • 1970-01-01
      • 2016-09-05
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2018-11-15
      • 2016-08-12
      • 1970-01-01
      相关资源
      最近更新 更多