Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用REST/JPA发送可选附加属性的最佳方式是什么?_Java_Rest_Jpa - Fatal编程技术网

Java 使用REST/JPA发送可选附加属性的最佳方式是什么?

Java 使用REST/JPA发送可选附加属性的最佳方式是什么?,java,rest,jpa,Java,Rest,Jpa,我用JPA定义了下表: @Data @Entity public class Project { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; @Column(unique = true) private String name; private Integer budget; private String description; private Boolean

我用JPA定义了下表:

@Data
@Entity
public class Project {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @Column(unique = true)
  private String name;

  private Integer budget;

  private String description;

  private Boolean isArchived;

  private LocalDate archivedDate;

  @Transient
  private Integer usedBudget;

  @NotNull
  @ManyToOne
  private Customer customer;
}
我有一个restapi方法
getProjects()
,它返回数据库中的所有项目
usedBudged
不会保留在数据库中,必须进行计算。在大多数情况下,当我调用
getProjects()
时,我不需要
usedBudget
属性。但是在一种情况下,我希望计算项目的
usedBudget
,并将其与项目对象一起直接发送,因此我不必首先获取所有项目,然后为每个项目单独调用API来获取
usedBudget
。因此,为了实现这一点,我向项目实体添加了一个
usedBudget
属性,并将其标记为transient。这样,它就不会被持久保存在数据库中,每当我想获取
usedBudget
,我只需计算它并在返回项目对象之前进行设置。唯一的问题是,即使未设置(null),它也会通过JSON发送。是否有一种方法可以忽略/不发送该瞬态值,只要该值设置为null

我的问题的另一个解决方案可能是一个helper类,它扩展了Project,并具有一个附加属性
usedBudget
。因此,每当我需要
usedBudget
时,我都会返回helper类,当我不需要时,我只返回普通项目(在这种情况下没有瞬态usedBudget属性)。这样我就不会发送无用的空值


以下哪种方法更好?是否有更好的方法?

在持久化的对象(实体)和REST api服务的对象之间应该有一个清晰的分隔:它们被调用。例如:

@Data
public class ProjectDTO {

    private long id;
    private String name;
    private Integer budget;
    private String description;
    private Boolean isArchived;
    private LocalDate archivedDate;
    private Customer customer;
}
但是,如果在特定上下文中,您需要返回包含已使用预算的项目,则可以使用此DTO:

@Data
public class ProjectWithBudgetDTO extends ProjectDTO {

    private Integer usedBudget;
}
当然,从实体创建dto需要一些工作,但这非常简单


通过这种方式,API与持久化数据模型分离,允许它们以不同的方式发展。例如,您可以在数据库中添加一个新字段,从而干扰RESTAPI客户机。或者甚至删除一个字段,并在DTO中保留一个默认值。

在持久化的对象(实体)和REST api服务的对象之间应该有一个清晰的分隔:它们被调用。例如:

@Data
public class ProjectDTO {

    private long id;
    private String name;
    private Integer budget;
    private String description;
    private Boolean isArchived;
    private LocalDate archivedDate;
    private Customer customer;
}
但是,如果在特定上下文中,您需要返回包含已使用预算的项目,则可以使用此DTO:

@Data
public class ProjectWithBudgetDTO extends ProjectDTO {

    private Integer usedBudget;
}
当然,从实体创建dto需要一些工作,但这非常简单


通过这种方式,API与持久化数据模型分离,允许它们以不同的方式发展。例如,您可以在数据库中添加一个新字段,从而干扰RESTAPI客户机。或者甚至删除一个字段,并在DTO中保留一个默认值。

您是否尝试过
@JsonInclude(Include.NON_NULL)
?另请参见您所称的helper类,它的名称为:DTO()。这是一种更好的方法。您是否尝试过
@JsonInclude(Include.NON_NULL)
?另请参见您所称的helper类,它的名称为:DTO()。这是一种更好的方法。要创建ProjectDTO,我是否将项目实体作为参数传递到ProjectDTO的构造函数中,并将我想要的值复制到ProjectDTO?这样我就可以只复制我想要的值,如果我想添加其他值。@M.Dietz是的,这是一种(最简单的)可能性。另一个是有一个单独的类来执行映射实体->dto。要创建ProjectDTO,我是否只需将项目实体作为参数传递给ProjectDTO的构造函数,并将我想要的值复制到ProjectDTO?这样我就可以只复制我想要的值,如果我想添加其他值。@M.Dietz是的,这是一种(最简单的)可能性。另一个是有一个单独的类来执行映射实体->dto。