当前位置: 首页 > 面试题库 >

如何从Spring Data中正确使用PagedResourcesAssembler?

梁华清
2023-03-14
问题内容

我正在使用Spring 4.0.0.RELEASE,Spring Data Commons 1.7.0.M1,Spring Hateoas 0.8.0.RELEASE

我的资源是一个简单的POJO:

public class UserResource extends ResourceSupport { ... }

我的资源汇编器将User对象转换为UserResource对象:

@Component
public class UserResourceAssembler extends ResourceAssemblerSupport<User, UserResource> { 
    public UserResourceAssembler() {
        super(UserController.class, UserResource.class);
    }

    @Override
    public UserResource toResource(User entity) {
        // map User to UserResource
    }
}

在我的UserController内,我想Page<User>从我的服务中检索,然后将其转换为PagedResources<UserResource>using PagedResourcesAssembler.

@RequestMapping(value="", method=RequestMethod.GET)
PagedResources<UserResource> get(@PageableDefault Pageable p, PagedResourcesAssembler assembler) {
    Page<User> u = service.get(p)
    return assembler.toResource(u);
}

这不会调用UserResourceAssembler,只是User返回的内容而不是我的custom UserResource

返回单个资源的工作原理是:

@Autowired
UserResourceAssembler assembler;

@RequestMapping(value="{id}", method=RequestMethod.GET)
UserResource getById(@PathVariable ObjectId id) throws NotFoundException {
    return assembler.toResource(service.getById(id));
}

PagedResourcesAssembler想一些通用的说法,但我不能使用T toResource(T),因为我不想将我Page<User>PagedResources<User>,特别是因为User是一个POJO,没有资源。

所以问题是:它如何工作?

编辑:
我的WebMvcConfigurationSupport:

@Configuration
@ComponentScan
@EnableHypermediaSupport
public class WebMvcConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(pageableResolver());
        argumentResolvers.add(sortResolver());
        argumentResolvers.add(pagedResourcesAssemblerArgumentResolver());
    }

    @Bean
    public HateoasPageableHandlerMethodArgumentResolver pageableResolver() {
        return new HateoasPageableHandlerMethodArgumentResolver(sortResolver());
    }

    @Bean
    public HateoasSortHandlerMethodArgumentResolver sortResolver() {
        return new HateoasSortHandlerMethodArgumentResolver();
    }

    @Bean
    public PagedResourcesAssembler<?> pagedResourcesAssembler() {
        return new PagedResourcesAssembler<Object>(pageableResolver(), null);
    }

    @Bean
    public PagedResourcesAssemblerArgumentResolver pagedResourcesAssemblerArgumentResolver() {
        return new PagedResourcesAssemblerArgumentResolver(pageableResolver(), null);
    }

    /* ... */
}

解:

@Autowired
UserResourceAssembler assembler;

@RequestMapping(value="", method=RequestMethod.GET)
PagedResources<UserResource> get(@PageableDefault Pageable p, PagedResourcesAssembler pagedAssembler) {
    Page<User> u = service.get(p)
    return pagedAssembler.toResource(u, assembler);
}

问题答案:

你似乎已经找到了正确的使用方法,但是我想在这里详细介绍一些细节,以便其他人也可以找到。我PagedResourceAssembler在这个答案中也有类似的细节。

表示模型
Spring HATEOAS附带了多种表示模型的基类,这些基类使创建带有链接的表示变得容易。开箱即用提供三种类型的类:

  • Resource-项目资源。有效地包装一些捕获单个项目并通过链接丰富它的DTO或实体。
  • Resources-集合资源,可以是某物的集合,但通常是Resource实例的集合
  • PagedResources-的扩展名Resources可捕获其他分页信息,例如总页数等。

所有这些类均源自ResourceSupport,这是Link实例的基本容器。

Resource assemblers

A ResourceAssembler现在是缓解组件,用于将你的域对象或DTO转换为此类资源实例。这里的重要部分是,它将一个源对象变成一个目标对象。

因此,PagedResourcesAssembler会采用Spring Data Page实例并将其PagedResources评估为,Page并创建必要PageMetadataprevnext链接来浏览页面,从而将其转换为实例。默认情况下-这可能是这里有趣的部分-它将使用普通的SimplePagedResourceAssembler(的内部类PRA)将页面的各个元素转换为嵌套Resource实例。

为了允许对此进行自定义,PRA提供了其他toResource(…)方法,这些方法需要委托ResourceAssembler来处理各个项目。因此,你最终会得到如下结果:

 class UserResource extends ResourceSupport { … }

 class UserResourceAssembler extends ResourceAssemblerSupport<User, UserResource> { … }

客户端代码现在看起来像这样:

 PagedResourcesAssembler<User> parAssembler = … // obtain via DI
 UserResourceAssembler userResourceAssembler = … // obtain via DI

 Page<User> users = userRepository.findAll(new PageRequest(0, 10));

 // Tell PAR to use the user assembler for individual items.
 PagedResources<UserResource> pagedUserResource = parAssembler.toResource(
   users, userResourceAssembler);

Outlook

从即将推出的Spring Data Commons 1.7 RC1(和Spring HATEOAS 0.9过渡而来)开始,prev和next链接将作为RFC6540兼容URI模板生成,以暴露在HandlerMethodArgumentResolversfor Pageable和中配置的分页请求参数Sort。

你可以通过注释config类来简化上面显示的配置,该类@EnableSpringDataWebSupport将使你摆脱所有显式的bean声明



 类似资料:
  • 我正在使用Spring 4.0.0. RELEASE,Spring数据共享1.7.0. M1,Spring Hateoas 0.8.0. RELEASE 我的资源是一个简单的POJO: 我的资源汇编程序将User对象转换为UserResources对象: 在我的UserController我想检索

  • 本文向大家介绍Array.filter中如何正确使用Async,包括了Array.filter中如何正确使用Async的使用技巧和注意事项,需要的朋友参考一下 1. 如何仅保留满足异步条件的元素 在第一篇文章中,我们介绍了 async / await 如何帮助处理异步事件,但在异步处理集合时却无济于事。在本文中,我们将研究该filter函数,它可能是支持异步函数的最直观的方法。 2. Array.

  • 问题内容: 我只想检索UserAccount类中的某些列,所以我有以下代码: 我得到了空值作为回报。但是,如果我注释掉setProjections,我将获得具有所有属性的用户。在这种情况下,如何正确使用setProjection? 问题答案: 它返回一个Object数组,因此代码应为:

  • 问题内容: 我不知道我在哪里错了:/。当我运行这段代码时,我得到的只是一个空白元素。我似乎无法让insertRule方法执行任何操作(甚至不会产生错误)。我想念什么吗? 问题答案: 这有点令人困惑,但是您的代码确实可以工作,只是您看不到返回的XML树中插入的规则。 为了验证您的代码是否有效,您可以执行两个测试: 运行上面的代码片段,您可以看到CSS规则确实适用。并且属性也在控制台中更改。 当浏览器

  • 问题内容: 如何使用从类路径中查找递归资源? 例如 在“目录”中查找所有资源:想象一下 不幸的是,这只会检索到恰好该“目录”。 所有资源都已命名(递归) 但这返回一个空。 还有一个额外的问题:与有什么不同? 问题答案: 没有办法递归搜索类路径。您需要知道资源的完整路径名才能以这种方式检索它。该资源可能位于文件系统中的目录中,也可能位于jar文件中,因此它不像执行“类路径”的目录列表那样简单。您将需

  • 问题内容: 我最近开始使用ScriptManager。我有一个通过JavaScript填充的ASP.NET DropDownList控件。但是,我正在使用事件验证。因此,如果我不使用下拉菜单中的“ RegisterForEventValidation”调用,则会遇到以下错误。我怎么知道在第二个参数中设置什么值(我有“值”)?我正在通过JavaScript填充下拉列表,因此我不知道后面的代码中包含哪