spring - HAL 与 Spring Hateoas 和 Mvc(无引导)

标签 spring spring-mvc spring-hateoas hal

我使用 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 {
}

ApiInitializer.java:

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[] { "/" };
  }

pom.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>
    ...

AdaptationRestController.java:

@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);
    }
}

AdaptationResource.java:

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"}
},
...

最佳答案

如果您使用 Spring Data JPA 进行数据访问,您可以通过添加 EnableSpringDataWebSupport 以声明方式启用其 Web 支持。这将为 Controller 方法注册一堆 ArgumentResolvers。简而言之,您可以将 PagedResourcesAssembler 参数添加到您的方法中,并使用其 toResource 方法将 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":{...}}

关于spring - HAL 与 Spring Hateoas 和 Mvc(无引导),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33495682/

相关文章:

java - 使用 Resteasy 的多个端点

java - Spring - 单例工厂实例化原型(prototype)作用域 bean

spring-mvc - Thymeleaf:Thymeleaf 模板解析错误

java - Spring Boot Data REST、HATEOAS 无法使用自定义 Controller

Spring Data REST 自定义查询集成

java - Spring Rest ErrorHandling @ControllerAdvice/@Valid

java - Spring Boot 测试 : Test passes, 但不应该(误报)

java - Spring MVC @Controller 方法签名

java - Spring中基于自定义注解的方法调用?

Spring 数据休息: how to customize the "_links" property representation?