当前位置: 首页 > 知识库问答 >
问题:

HAL配备Spring Hateoas和Mvc(无后备箱)

甄霖
2023-03-14

我正在使用spring mvc和hateoas构建一个restful api。之前,我将spring boot与hateoas一起使用,服务器按照我的预期呈现响应。现在,我没有使用spring boot,服务器无法正确呈现响应。从我的研究中,我发现一些人在谈论一种涉及消息转换器配置的解决方案。那么,除了注释@EnableHypermediaSupport,在没有spring boot的情况下设置媒体类型HAL还需要什么?

ApiConfiguration.java

@Configuration
@ComponentScan
@EnableWebMvc
@EnableHypermediaSupport(type = { HypermediaType.HAL })
public class ApiConfiguration {
}

初始化器。爪哇:

public class ApiInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

  @Override
  protected Class<?>[] getRootConfigClasses() {
      return null;
  }

  @Override
  protected Class<?>[] getServletConfigClasses() {
      return new Class[] { ApiConfiguration.class };
  }

  @Override
  protected String[] getServletMappings() {
      return new String[] { "/" };
  }

}

波姆。xml:

...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>4.2.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.hateoas</groupId>
        <artifactId>spring-hateoas</artifactId>
        <version>0.19.0.RELEASE</version>
    </dependency>
    ...

自适应控制器。爪哇:

@RestController
@ExposesResourceFor(Adaptation.class)
@RequestMapping(value = "/adaptations")
public class AdaptationRestController {

    ...
    @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = "application/vnd.xpto-adaptation+json")
    public ResponseEntity<AdaptationResource> getAdaptation(@PathVariable("id") String adaptationId) {
        Adaptation adaptation = adaptationGateway.getAdaptation(adaptationId);
        AdaptationResource adaptationResource = adaptationResourceAssembler.toResource(adaptation);

        return new ResponseEntity<AdaptationResource>(adaptationResource, HttpStatus.OK);
    }
}

适应资源。爪哇:

public class AdaptationResource extends Resource<Adaptation> {

    public AdaptationResource(Adaptation adaptation) {
        super(adaptation);
    }

}

我得到的是:

"links": [
    {
        "rel": "self",
        "href": "http://xpto.com"
    }
],
...

应该是什么:

"_links": {
    "self": {"href": "http://xpto.com"}
},
...

共有3个答案

唐啸
2023-03-14

基本上,我使用EntityLinks构建链接,而不从任何依赖框架的类扩展Pojo。

@RestController
@ExposesResourceFor(ProjectServiceResponse.class) 
public class ProjectController {
  @Autowired
  private org.springframework.hateoas.EntityLinks entityLinks;

  public HttpEntity<Resource<ProjectServiceResponse>> get(...){
    Resource resource = new Resource<ProjectServiceResponse>(response);
    resource.add(entityLinks.linkToCollectionResource(ProjectServiceResponse.class).withSelfRel());
    return new ResponseEntity<Resource<ProjectServiceResponse>>(resource, HttpStatus.OK);
  }
}

回应:

"_links": {
"self": {
  "href": "http://localhost:8080/project"
}

在我上面的代码ProjectServiceResponse中。课程是POJO。

您可以在github上参考完整的项目

公冶桐
2023-03-14

一个选择是让你的模型扩展org.springframework.hateoas.资源支持

public class MyModelClass extends ResourceSupport

然后呢

@RequestMapping(value="/myresource", method=RequestMethod.GET)
public ResponseEntity<Iterable<MyModelClass>> getAll() {
Iterable<MyModelClass> all= repository.findAll();
for(MyModelClass p : all) {
p.add(linkTo(methodOn(MyController.class).getAll()).slash(p.getId()).withSelfRel());
}
return new ResponseEntity<>(all, HttpStatus.OK);
}
申嘉慕
2023-03-14

如果您使用Spring Data JPA进行数据访问,您可以通过添加EnableSpringDataWebSupport声明性地启用其Web支持。这将为Controller方法注册一堆ArgumentResolvers。简而言之,您可以向方法添加PagedResourcesAssembler参数,并使用其toResources方法将Pageed实体转换为资源,如下所示:

    @RequestMapping(method = GET)
    public ResponseEntity getAll(PagedResourcesAssembler ass) {
        Page<User> users = userRepository.findAll(new PageRequest(0, 10));
        PagedResources pagedResources = ass.toResource(users, assembler);

        return ok(pagedResources);
    }

通过这个json输出:

{"_embedded":{...},"_links":{"self":{"href":"http://localhost:8080/users"}},"page":{...}}
 类似资料:
  • 问题内容: 我正在使用此布局。很大程度上取决于CSS calc进行必要的计算。 现在,我无法在Safari中使用它。我做错了什么吗? 而且,是否有一种方法可以为不支持该功能的浏览器引入后备机制?百分比不会做得很好,因为我必须从侧面的两个中减去中间的对象。 谢谢。 问题答案: 我解决此问题的方法是引入纯CSS后备功能,即不支持CSS calc的旧版浏览器只能读取。 如果浏览器无法读取计算值,则左右面

  • 蓝牙配网 参数说明 字段 类型 必须? 说明 wifi RKWiFi 是 蓝牙发送Wifi信息 示例代码 Swift: // 获取 手机当前连接的 WIFI var wifi: RKWiFi = RKWiFi.current() RokidMobileSDK.binder?.sendWiFi(device: device, wifi: wifi, password:"123456") Objc:

  • 设备配网 接口说明 发送绑定数据 这里会发送到正在连接的蓝牙设备 参数说明 字段 类型 必须? 说明 binderData DeviceBinderData 是 蓝牙发送信息 举个大栗子 // 构建绑定数据 DeviceBinderData binderData = DeviceBinderData.newBuilder() .wifiPwd("your wif

  • 我只是想学习,构建一个Spring HATEOAS应用程序。 我已将自定义查询添加到我的存储库中: 我得到了很好的JSON响应,但由于这是可分页的,我想要一个链接部分。。。使用上一个/下一个。 我该如何添加它? 主url提供了所有客户的列表,链接没有问题,我只想将这些链接添加到自定义可分页方法。 --编辑-- 啊! 使findAllFitered方法返回一个页面而不是列表。。。

  • 主要内容:参考地点,转换后备缓冲器(TLB)寻呼的缺点 页表的大小可能非常大,因此浪费了主存。 CPU将花费更多时间从主存储器中读取单个字。 如何减少页面大小 页面大小可以通过增加页面大小来减小,但会导致内部碎片,并且也会导致页面浪费。 其他方式是使用多级分页,但增加了有效访问时间,因此这不是一个实际的方法。 如何减少有效的访问时间 CPU可以使用一个寄存器,里面存储页表,这样访问页表的访问时间可以变得非常少,但是寄存器并不便宜,并且与页表

  • “后端”只是一个,mdbook在书籍渲染过程中调用的程序。该程序会拿到传递到stdin的书籍和配置信息的 JSON 表达式。一旦后端收到这些信息,就可以自由地做任何想做的事情. GitHub 上已有几个备用后端,可以作为你实践,如何实现这一功能的粗略示例. mdbook-linkcheck- 用于验证书籍的简单程序,不包含任何损坏的链接 mdbook-epub- EPUB 渲染器 mdbook-t