我有一个带uml图的域名
here。
我已经为类JpaRepository
声明了Invoice, Contract, Consultant, User, Region
es
我不想公开这些存储库,因为我需要围绕它们包装一些业务规则。
我已经定义了一些预测,它们似乎与我的存储库一起使用,但它们并没有引入我的@RestController
这是我的包装器的草稿:
@RestController
@RequestMapping("/contractService")
public class ContractServiceImpl extends ServiceImpl<Contract, Long> implements IService<Contract, Long>
{
@RequestMapping("/all")
public List<Contract> all()
{
return findAll();
}
@RequestMapping(value = "/one", method = GET)
public Contract one(@RequestParam(value = "id", defaultValue = "1") Long id)
{
log.info(format("id=%d", id));
return repository.getOne(id);
}
@Autowired
RepositoryRestConfiguration rrc;
@RequestMapping("config")
public List<String> getConfig()
{
return rrc.projectionConfiguration()
.getProjectionsFor(Contract.class)
.entrySet().stream()
.map(e -> e.getKey() + "->" + e.getValue())
.collect(Collectors.toList());
}
这里最后一种方法是验证投影是否已配置。即:
http://localhost:8080/invoiceapi/contractService/config
得到结果:
[
"brief->interface e.invoice.entity.projection.Brief",
"contractEdit->interface e.invoice.entity.projection.ContractEdit"
]
我的预测定义为:
@Projection(name="brief", types={Contract.class, Consultant.class, User.class, Region.class})
public interface Brief
{
public Long getId();
public String getName();
}
对存储库的休息调用会直接返回我所需的投影结果,仅限id和名称:
http://localhost:8080/invoiceapi/contracts?projection=brief
http://localhost:8080/invoiceapi/contracts/1?projection=brief
然而那些进入我的控制器:
http://localhost:8080/invoiceapi/contractService/all?projection=brief
http://localhost:8080/invoiceapi/contractService/one?id=2&projection=brief
对于定义好的JpaRepositories,它们递归地抓取所有可到达的实体。 (用户下面的应用程序对象不显示)
我的控制器返回一个Content-Type: application/json
的文档,而基于JpaRepository的文档返回一个很酷的Content-Type: application/hal+json
。它们的输出也是不同的:我的控制器返回一个更简单的输出,而基于JpaRepository的输出将关联的对象放入一个名为_embedded
的数组中。