Spring 弹簧座投影不起作用

Spring 弹簧座投影不起作用,spring,rest,spring-data-jpa,projection,spring-restcontroller,Spring,Rest,Spring Data Jpa,Projection,Spring Restcontroller,我有一个带有uml图的域 . 我已为以下类别声明了一份声明:发票、合同、顾问、用户、地区 我不想公开存储库,因为我需要围绕它们包装一些业务规则。 我已经定义了一些投影,它们似乎与我的存储库配合使用,但它们并不与我的@RestController 这是我的包装纸草稿: @RestController @RequestMapping("/contractService") public class ContractServiceImpl extends ServiceImpl<

我有一个带有uml图的域 . 我已为以下类别声明了一份声明:
发票、合同、顾问、用户、地区
我不想公开存储库,因为我需要围绕它们包装一些业务规则。 我已经定义了一些投影,它们似乎与我的存储库配合使用,但它们并不与我的
@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());
        }
将结果获取为:

[
"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和名称:

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
它们递归地爬行所有可到达的实体,直到定义的JPA位置为止。(用户下方的应用程序对象不显示)


My controller返回一个带有
内容类型:application/json
的文档,而基于JpaRepository的文档返回一个外观酷炫的
内容类型:application/hal+json
。它们的输出也不同:我的控制器返回一个更直接的输出,而基于JPA的控制器将相关对象放入一个名为
\u embedded

的数组中,为什么会有所不同?您正在从您的
/all
返回所有
合同
,而不是投影,
/one
返回一个
字符串
,而不是投影。很明显,这也是你将得到的回报。
projection
属性非常无用,因为您没有对它做任何操作,对于SpringDataREST,这是返回指定投影而不是实际对象的触发器。如果你想返回一个投影,我不确定我是否完全理解你的解释。我不知道如何通过返回投影来返回投影。您的方法分别返回
列表
字符串
。如果您想让它返回
Brief
,那么让它返回
Brief
,而不是其他类型。让我解释一下我的理解:如果我必须返回一个Brief,那么合同应该执行Brief。假设我将有另一个投影,“详细”。显然,合同也将实现这一点。我希望我的all()或one()返回对客户机应用程序用例不同的契约的不同预测。在这种情况下,我将不得不重载返回简短/列表和详细/列表的方法one()/all()。是否正确?或者返回
对象
,并根据
投影
属性在方法内部进行确定。但是为什么您需要这个,为什么您不能使用SpringDataREST呢?我强烈建议您看看源代码以及它是如何在那里实现的,为什么会有所不同呢?您正在从您的
/all
返回所有
合同
,而不是投影,
/one
返回一个
字符串
,而不是投影。很明显,这也是你将得到的回报。
projection
属性非常无用,因为您没有对它做任何操作,对于SpringDataREST,这是返回指定投影而不是实际对象的触发器。如果你想返回一个投影,我不确定我是否完全理解你的解释。我不知道如何通过返回投影来返回投影。您的方法分别返回
列表
字符串
。如果您想让它返回
Brief
,那么让它返回
Brief
,而不是其他类型。让我解释一下我的理解:如果我必须返回一个Brief,那么合同应该执行Brief。假设我将有另一个投影,“详细”。显然,合同也将实现这一点。我希望我的all()或one()返回对客户机应用程序用例不同的契约的不同预测。在这种情况下,我将不得不重载返回简短/列表和详细/列表的方法one()/all()。是否正确?或者返回
对象
,并根据
投影
属性在方法内部进行确定。但是为什么您需要这个,为什么您不能使用SpringDataREST呢?我强烈建议您看看源代码以及它是如何在那里实现的。
http://localhost:8080/invoiceapi/contractService/all?projection=brief
http://localhost:8080/invoiceapi/contractService/one?id=2&projection=brief