我在Spring Date REST存储库中配置了父子实体。父母看起来像这样
@Entity
@Table(name = "DPST_DTL")
public class Deposit {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "deposit", orphanRemoval=true)
private List<Instrument> instrumentList = new ArrayList<Instrument>();
}
孩子看起来像这样:
@Entity
@Table(name = "INSTR_DTL")
public class Instrument {
@ManyToOne
@JoinColumn(name = "DPST_ID")
@JsonBackReference
private Deposit deposit;
}
我为Deposit定义了RepositoryRestresource,如下所示:
@RepositoryRestResource(collectionResourceRel = "deposit", path = "deposit")
public interface DepositRepository extends PagingAndSortingRepository<Deposit, Long>{
}
和Instrument的相同内容如下:
@RepositoryRestResource(collectionResourceRel = "instrument", path = "instrument")
public interface InstrumentRepository extends PagingAndSortingRepository<Instrument, Long>{
}
如果我尝试使用一些子记录POST父级,我会收到如下消息: &#34; message&#34;:&#34;无法从类型[java.net.URI]转换为类型[com.XXX.irh.insprc.instrument.Instrument]以获取值&#39; countryCode&#39; ;嵌套异常是java.lang.IllegalArgumentException:无法解析URI countryCode。是本地的还是远程的?只有本地URI可以解析。&#34; },
&#34; COUNTRYCODE&#34;恰好是孩子JSON中的第一个字段
如果我用一些孩子查询父级,那么结果JSON不会显示子级,只显示如下链接: &#34; instrumentList&#34;:{&#34; href&#34;:&#34; http://localhost:9090/deposit/8/instrumentList&#34;}
但是,如果我使用exported = false标记子存储库,我可以解决此问题。但是不能通过REST API公开子实体。
问题是:
无论如何,我可以为父实体和子实体公开基本的CRUD功能,而无需编写自定义控制器等。
据我所知,根据DDD最佳实践,我的父亲是一个应该通过REST Repository公开的聚合,但我确实有一些用例,我需要独立的CRUD功能。
答案 0 :(得分:1)
您可以使用projections:
@Projection(name = "withInstruments", types = Person.class)
public interface WithInstruments {
@Value("#{target.depositName}")
String getDepositName();
List<Instrument> getInstrumentList();
}
然后你可以一起获取你的实体:
GET /deposits?projection=withInstruments
{
"depositName": "deposit1",
"instrumentList": [
{
"intrumentName": "instrument1",
},
{
"intrumentName": "instrument1",
}
]
}
其他info