【问题标题】:Merge Spring data rest links with controller links on same Entity将 Spring 数据休息链接与同一实体上的控制器链接合并
【发布时间】:2017-02-03 13:03:28
【问题描述】:

我想将 HATEAOS 链接与 Controller 和 Repository 上的方法结合起来。

@RepositoryRestController
@ResponseBody
@ExposesResourceFor(Group.class)
@RequestMapping(value = "/api/v2/groups", produces = MediaTypes.HAL_JSON_VALUE)
public class GroupController {

    @Resource
    private GroupService groupService;

    @RequestMapping(value = "/external", method = POST)
    public  @ResponseBody   PersistentEntityResource saveExternalGroup(
            @RequestBody Group newGroup,
            PersistentEntityResourceAssembler assembler) {

        return assembler.toResource(groupService.saveExternalGroup(newGroup));

    }

}

存储库:

@RepositoryRestResource(excerptProjection = GroupSummary.class)
public interface GroupDao extends DefaultDao<Group, Long> {

    @NotNull
    List<Group> findByState(@Nullable GroupState state);
...other methods...

我想实现有可能去 /api/v2/groups 并有链接到 /external。目前,仅返回来自存储库的链接:

"_links": {
    "first": {
      "href": "http://localhost:8300/api/v2/groups?page=0&size=20"
    },
    "self": {
      "href": "http://localhost:8300/api/v2/groups"
    },
    "next": {
      "href": "http://localhost:8300/api/v2/groups?page=1&size=20"
    },
    "last": {
      "href": "http://localhost:8300/api/v2/groups?page=1&size=20"
    },
    "profile": {
      "href": "http://localhost:8300/api/v2/profile/groups"
    },
    "search": {
      "href": "http://localhost:8300/api/v2/groups/search"
    }
  },

我应该如何实现上述所有内容以及类似的内容:

"external": {
          "href": "http://localhost:8300/api/v2/groups/external"
        }

或者“/external”是 POST 有问题吗?如果是这样,请用“method=GET”评论并考虑这个问题。

【问题讨论】:

    标签: spring-boot spring-data-rest hateoas spring-hateoas


    【解决方案1】:

    选项1:

    如果是一次性的,您可以使用 Resource 类在控制器方法中添加链接。

    @RequestMapping(value = "/external", method = POST)
    public  @ResponseBody   PersistentEntityResource saveExternalGroup(
            @RequestBody Group newGroup,
            PersistentEntityResourceAssembler assembler) {
    
        PersistentEntityResource resource = assembler.toResource(groupService.saveExternalGroup(newGroup));
    
        // Replace with ControllerLinkBuilder call, or EntityLinks as you see fit.
        resource.add(new Link("http://localhost:8300/api/v2/groups/external","search"));
    
        return resource;
    }
    

    选项 2:

    如果您希望将此链接添加到每个渲染的Resource&lt;Group&gt;,然后创建一个ResourceProcessor 组件来添加它。

    @Component
    public class GroupResourceProcessor implements ResourceProcessor<Resource<Group>> {
    
        @Override
        public Resource<Group> process(Resource<Group> groupResource) {
    
            // Replace with ControllerLinkBuilder call, or EntityLinks as you see fit.
            groupResource.add(new Link("http://localhost:8300/api/v2/groups/external","search"));
    
            return groupResource;
        }
    
    }
    

    【讨论】:

    • 选项 1) 该链接在方法执行时生成。我想要实现的是当我转到 /groups 时,将链接到所有 DAO 方法和所有到 Controller 的链接。选项 2)我添加了处理器,但在我看来它从未被调用过。然后我发现这是使用投影时的问题(我这样做):stackoverflow.com/questions/33501648/…
    • @Cipous 好的,那么选择 2。如果您查看所链接的那个问题的附加 JIRA 问题,您会发现您可以执行此操作,但您必须创建一个 ResourceProcessor&lt;Resource&lt;GroupProjection&gt;&gt; 或任何您的投影,以实现该逻辑。你应该仍然可以让它工作。
    • 具有正确投影的选项适用于每条记录,但不在“根”级别提供。根级别是指如果我在数据库中没有记录,它会为您提供“...profile/groups”、“.../groups/search”和“self”。有没有办法添加另一个链接?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    相关资源
    最近更新 更多