1

我在这里有一个带有 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.

4

0 回答 0