我在这里有一个带有 uml 图的域
。我已经JpaRepository
为类声明了 es:Invoice, Contract, Consultant, User, Region
我不想按原样公开存储库,因为我需要围绕它们包装一些业务规则。我已经定义了一些预测,它们似乎适用于我的存储库,但它们不适用于我的@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());
}
最后一种方法是验证是否配置了投影。IE:
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();
}
对存储库的 Rest 调用直接根据需要返回我的预计结果,仅 id 和 name:
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
.