我被困在给定的场景中:
有三个实体
a(账单(与供应商的多对一关系([双向]b( 供应商(与供应商和供应商银行的一对多关系(
c(供应商银行(与供应商的多对一关系([单向]
账单:显示有限字段
@Entity
@Getter
@Setter
@ToString
@NoArgsConstructor
@Table(name="bill_details")
public class Bills {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="bill_id")
private int bill_id;
@Column(name="bill_no")
private String billno;
@ManyToOne(cascade = {CascadeType.MERGE})
@JoinColumn(name="b_vendor_id")
private Vendors vendors;
/* Args contructor code here */
@JsonManagedReference
public Vendors getVendors() { return vendors; }
VendorBank:显示有限字段
public class VendorBank {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="v_bank_id")
private int vendorBankId;
@Column(name="v_acc_no")
private String accountNumber;
@Column(name="v_vendor_id")
private int vendor_id;
/*Both constructor code here*/
}
供应商类别:仅显示导入字段
/*Lombok code here*/
public class Vendors {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="vendor_id")
private int vendor_id;
@Column(name="vendor_name")
private String vendor_name;
@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name="v_vendor_id")
private List<VendorBank> vendorBank;
@OneToMany(mappedBy = "vendors",cascade = {CascadeType.DETACH,CascadeType.MERGE,
CascadeType.PERSIST,CascadeType.REFRESH})
private List<Bills> bills;
@JsonBackReference
public List<Bills> getBills() {
return bills;
}
//@JsonManagedReference()
// @JsonIgnore
public List<VendorBank> getVendorBank() {
return vendorBank;
}
输出:
{
"bill_id": 102,
"billno": "B-858",
"vendors": {
"vendor_id": 3,
"vendor_name": "ABC Company",
"vendorBank": [
{
"vendorBankId": 14,
"accountNumber": "502998745002",
"vendor_id": 3
}
]
}
}
1.当我调用供应商端点时,我根据需要从供应商+供应商银行获得数据
2.但当我调用Bill端点时,我会从Bill+vendor+vendorbank获得数据,如上所述我不希望供应商银行来。如果我在vendorbank上使用JsonIgnore,那么我得到了正确的输出,但以上第1点出错]
好的,所以您想要实现的是将实体中的一些数据包含在一个上下文中,而不将其包含在另一个上下文。
我认为您不能通过在实体上使用纯注释来实现这一点,因为它们没有调用上下文。
那么,我们在这里能做什么呢?
我们可以使用杰克逊Mixins。例如:
class YourClass {
public int ignoreThis() { return 0; }
}
使用此Mixin
abstract class MixIn {
@JsonIgnore abstract int ignoreThis(); // we don't need it!
}
有了这个:
objectMapper.getSerializationConfig().addMixInAnnotations(YourClass.class, MixIn.class)
然后,您可以使用它将对象序列化到控制器中的json
中(在那里您可以将其发送到服务(,然后将其添加为响应主体并发送给用户。
如果您能够以某种方式配置ObjectMapper
,这将是理想的,Spring在幕后使用它来实现这一点,然而,这是不可能的(至少很容易(,因为您需要将此objectMapper
仅绑定到您的特定控制器,而不是所有控制器。