在Spring Data REST中将父实体和子实体公开为REST存储库

时间:2017-12-12 04:13:53

标签: spring-data-rest

我在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功能。

1 个答案:

答案 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