当前位置: 首页 > 知识库问答 >
问题:

@类上忽略NotNull

葛子昂
2023-03-14

我有一个实体:

@Entity
public class MyEntity {

  @Id
  private String Id;

  @NotNull
  @Column(nullable = false)
  private Integer size;

  public void setSize(Integer size) { this.size = size; }
  public Integer getSize() { return this.size; }

  public void setId(String id) { this.id = id; }
  public String getId() { return this.id; }
}

存储库:

@Repository
public class MyEntityDAO {

  @PersistenceContext
  private EntityManager em;

  public void create(MyEntity myEntity) {
    em.persist(myEntity);
  }
}

应引发异常的测试:

@RunWith(SpringRunner.class)
@Transactional
@SpringBootTest
public class MyEntityDAOTest {

  @Inject 
  private MyEntityDAO myEntityDAO;

  @Test(expected = ConstraintViolationException.class)
  public void nullSizeNotAllowedTest() {
    MyEntity myEntity = new MyEntity();
    myEntity.setSize(null);
    myEntity.setId("entity_id");
    myEntityDAO.create(myEntity);
  }
}

然而,测试失败。实体不会引发所需的异常。注释适用于字符串,但不适用于整数。

MyEntity的自动生成表:

FIELD   TYPE            NULL    KEY     DEFAULT  
ID      VARCHAR(255)    NO      PRI     NULL
SIZE    INTEGER(10)     NO              NULL

更新

当我将 @GeneratedValue(策略=...)指定到 Id字段时,一切正常。但是,我希望能够将自己的值分配给主键字段。

更新2

更新的实体(存储库也已更新以反映更改):

  
   @Entity
public class MyEntity {

  @Id
  private Long Id;

  @NaturalId
  private String oldId;

  @NotNull
  @Column(nullable = false)
  private Integer size;

  /* getters and setters */
}

  

MyEntity的自动生成表:

  
   FIELD   TYPE            NULL    KEY     DEFAULT  
ID      BIGINT(19)      NO      PRI     NULL
OLD_ID  VARCHAR(255)    YES     UNI     NULL
SIZE    INTEGER(10)     NO              NULL

  

共有2个答案

那弘
2023-03-14

试试这个,在我的案例中,效果如预期。

@Column(name = "size", nullable = false)
@NotNull(message= "size may not be empty.")
private Integer size;
向锦
2023-03-14

您必须调用entityManager.flush()后调用entityManager.save()

否则,将不会抛出异常,也不会在测试中拾取异常

下面是一个完整的工作示例:

我的实体:

@Entity
public class MyEntity {

    @Id
    private String id;

    @Column(nullable = false)
    @NotNull
    private Integer size;

    public MyEntity(){}

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Integer getSize() {
        return size;
    }

    public void setSize(Integer size) {
         this.size = size;
    }
}

MyEntityDAO:

@Repository
public class MyEntityDAO {

     @PersistenceContext
     private EntityManager entityManager;

     public void save(MyEntity myEntity){
          entityManager.persist(myEntity);
          entityManager.flush();
     }
}

MyEntityDAOTest:

@RunWith(SpringRunner.class)
@Transactional
@SpringBootTest
public class MyEntityDAOTest {

    @Autowired
    private MyEntityDAO myEntityDAO;

    @Test(expected = ConstraintViolationException.class)
    public void nullSizeNotAllowedTest() throws Exception {
        MyEntity myEntity = new MyEntity();
        myEntity.setId("testId");
        myEntity.setSize(null);
        myEntityDAO.save(myEntity);
    }
}
 类似资料:
  • 问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc

  • 问题内容: 我正在编写一个使用Oracle JDBC驱动程序的Java程序。我已经在我的类路径中设置了它。当我在IDE中运行程序(作为jdbc作为库添加)时,程序运行正常。当我尝试部署它时,它完全忽略了classpath中的清单,并给了我一个NoClassDefFoundError。 我想使用客户端的JDBC驱动程序(已安装的JDBC驱动程序),并且不提供自己的驱动程序。我打包了来自JDevelo

  • 问题内容: 我正在尝试为api 编写Web服务。因此,我编写了一个MyLogRecord类,该类继承自LogRecord。我用JAX- B注释对此类进行了注释,包括,因此它将忽略未注释的字段和属性。当我启动tomcat时,出现错误,并且其他类没有默认的构造函数,但是没有带注释的方法对Level类或任何其他类进行任何引用。这些由父类引用。 我的子类具有需要定义的所有内容。如何使JAX-B完全忽略父类

  • 我正在开发一个REST API,使用Spring Boot启动数据Rest。我想与JPA同步的一个类是User类,其中包含有关用户的信息,包括谁被允许访问API。 不幸的是,拥有用户和UserRepository意味着我的用户类在API中公开。我能够删除Id(在configureRepositoryRestConfiguration函数中)、用户名和密码(通过向我的用户类的每个变量添加@JsonI

  • 问题内容: 鉴于以下课程, 假设在调用ClassOne.main之后还有其他事情要做,则下面的类也将被破坏。 有没有办法忽略System.exit(1); ClassTwo的调用中对ClassOne的了解? 问题答案: 您 本身 不能忽略它,但是可以防止它通过SecurityManager终止JVM。查看此问题以获取详细的代码示例。