java - 对实体对象 spring/JPA/Java 进行验证的缺点

标签 java jpa orm entity

据我所知,有一个原则是不创建具有不适当字段值的类实例。 为了处理这个问题,我使用了具有所有必要字段的类构造函数。然后我检查参数并在参数错误时抛出异常。

在 JPA 实体类中使用此解决方案是否合适,或者我应该在服务层中检查它?

在使用 Hibernate 注释保存之前,在 Controller 层验证参数。

@Entity
public class Person {

  @Id
  @GeneratedValue
  private Long id;

  @Column(name = ColumnNames.NAME, nullable = true)
  @Size(min = 2, max = 50, message = "{person.name.size}")
  String name;

  @Column(name = ColumnNames.DATE_OF_BIRTH, nullable = true)
  private LocalDate dateOfBirth;

  protected Person(){}

  public Person(String name, LocalDate dateOfBirth)  
     throws IllegalArgumentException, NullPointerException { 

     Objects.requireNonNull(name);
     Objects.requireNonNull(dateOfBirth);
     Preconditions.checkArgument(name.length() > 1, 
        "Name should have length more than 1 character");

     this.name = name;
     this.dateOfBirth = dateOfBirth;
  }

  //getters
}

最佳答案

首先让我们弄清楚典型的MVC 架构中的三个主要组件。

Controller: Controller 组件充当输入和业务逻辑之间的网关。您可以在此处指定要开发的 API 类型,是 GET 请求还是 POST 请求?它应该接受什么样的数据?您的 API 应返回什么作为响应。该层还用于验证来自用户的数据,这样我们就不会在服务层进行所有繁重的工作,然后得出结论,我们没有合适的数据开始。在确定数据的合理性后,我们将继续进行实际的逻辑实现区域服务

服务:服务应该为 API 提供业务逻辑,因此作为存储库的抽象,服务应该是唯一可以访问存储库的服务。这是完成所有繁重工作的地方,如果认为有必要,我们将解析到 Repository 层以访问数据库。

Repository:这是离数据库最近的一层,它只是用来处理应用程序和数据库之间的所有通信。

对于您的案例,您想对实体本身进行验证,但它有一些缺点。

  • 安全性:如果您对实体本身进行验证,您通常会在 Controller 级别公开它,这被认为是一个很大的安全问题,因为您通常会公开您的表结构,从而使应用程序容易受到攻击。
  • 重量级:本应处理此问题的所有其他层将简单地充当传递 channel ,这会增加执行所有工作的实体的负载。
  • 维护:您可能会遇到不同的规范,具体取决于 API 本身。然后你别无选择,只能用更新的验证重写一个全新的实体,这会降低你的可重用性。

有什么不明白的可以私信

.

关于java - 对实体对象 spring/JPA/Java 进行验证的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57198348/

相关文章:

java - Desktop.isDesktopSupported() 在 jar 中崩溃

java - 类型安全条件查询,JPA 2.0 的新特性 : Path unknown?

java - 如何在Spring Boot中显示mysql View ?

java - 将 java BitSet 保存到数据库

java - Hibernate 抛出 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : check the manual for the right syntax to use near 'localTime' time

python - 如何使用Peewee查询多个相似的数据库?

java - 当使用带有 available() 方法的流返回相对较小的值时,Jetty HttpClient 在 POST 时崩溃

java - Mongo java驱动程序-仅获取数据而不是字段名称

java - Eclipse + MySql + Hibernate,一个好的介绍?

java.awt.Robot.keyPress 用于连续击键