Spring REST投影无法启动

时间:2015-07-13 14:24:08

标签: spring rest spring-data-jpa projection spring-restcontroller

我有一个带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的数组中。

0 个答案:

没有答案