Java 过滤嵌套实体spring boot中的响应
我通过以下方式设置了与Product-Cart的实体关系: Product.javaJava 过滤嵌套实体spring boot中的响应,java,spring-boot,jpa,spring-data-jpa,Java,Spring Boot,Jpa,Spring Data Jpa,我通过以下方式设置了与Product-Cart的实体关系: Product.java @Entity(name="Product") @Getter @Setter public class Product implements Serializable { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; private String name; p
@Entity(name="Product")
@Getter
@Setter
public class Product implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
private String description;
private int amount;
private String unit;
private double price;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn()
private Cart cart;
}
@Entity(name="Cart")
@Getter
@Setter
public class Cart implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
@OneToMany(
mappedBy="cart",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Product> shoppingList = new ArrayList<>();
private boolean payed = true;
}
Cart.java
@Entity(name="Product")
@Getter
@Setter
public class Product implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
private String description;
private int amount;
private String unit;
private double price;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn()
private Cart cart;
}
@Entity(name="Cart")
@Getter
@Setter
public class Cart implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
@OneToMany(
mappedBy="cart",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Product> shoppingList = new ArrayList<>();
private boolean payed = true;
}
如您所见,我只需要将产品ID和金额放在购物列表中(两者都来自于我建立实体关系的product)
这就是我提出POST请求的方式:
@PostMapping()
@ResponseStatus(HttpStatus.CREATED)
public Cart addProduct() {
return new Cart(this.service.create());
}
这就是我的服务逻辑:
@Override
public Cart create() {
Cart c = new Cart();
c.setPayed(false);
return this.repository.save(c);
}
这就是我需要帮助以某种方式制作c.setShoppingList(???)以从产品中获取id和数量,但是只有这两个IMO将实体直接序列化到客户端是一种不好的、潜在危险的做法。它混合了关注点(实体关注点=如何持久化此内容,DTO关注点=如何序列化此内容),并可能泄漏信息(有人向客户端不应看到的实体添加字段,例如电子邮件、密码,但此实体已序列化且电子邮件泄漏)。我知道它很方便,到处都用,但我仍然认为它不好。在您的情况下,我将为购物车创建一个DTO,其中包含产品的DTO,并且只包含必需的字段;可能是Jackson,所以请查看
@JsonIgnore
,通常,它如何限制发送给客户端的字段,例如。Jackson非常丰富,您可能会发现其他更适合您需要的方法。您可以创建响应对象(根据响应json的java类),并使用getter setters将其作为响应实体返回。