在Spring中生成一致的资源链接

时间:2014-09-19 04:16:51

标签: java spring spring-mvc hateoas spring-hateoas

使用以下代码行生成链接时:

indexResource.add(linkTo(IndexController.class).withSelfRel());

生成此JSON:

{
  "links" : [ {
    "rel" : "self",
    "href" : "http://localhost:8080"
  } ]
}

但是,Spring Data Rest生成的资源链接产生了这个JSON:

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/persons{?page,size,sort}",
      "templated" : true
    }
  }
}

特别是,我想模仿Spring Data Rest生成的那个。我该怎么做?

我正在使用具有以下配置的Spring Boot:

@Configuration
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)
@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)
@ComponentScan
public class Application { ... }

保留或删除@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)似乎无法改变任何内容。

我还有以下gradle依赖项:

compile "org.springframework.boot:spring-boot-starter-data-rest"
compile "org.springframework.boot:spring-boot-starter-data-jpa"
compile "org.springframework.boot:spring-boot-starter-actuator"
compile "org.springframework.boot:spring-boot-starter-jetty"
compile "org.springframework.data:spring-data-envers:0.2.0.RELEASE"
compile "org.hibernate:hibernate-envers:4.3.6.Final"
runtime "mysql:mysql-connector-java:5.1.32"
testCompile "junit:junit"

4 个答案:

答案 0 :(得分:1)

Spring Data Rest使用HAL格式。它应该是更新版本的Spring HATEOAS的默认值。您可以使用Configuration类上的注释激活它:

@EnableHypermediaSupport(type= {HypermediaType.HAL})

<强>更新

我遇到了与Spring Boot类似的问题。我必须将以下内容添加到我的pom.xml

<dependency>
  <groupId>org.springframework.plugin</groupId>
  <artifactId>spring-plugin-core</artifactId>
  <version>1.1.0.RELEASE</version>
</dependency>

答案 1 :(得分:1)

为了生成HAL格式的JSON,您的HTTP请求必须接受application / hal + json(即Accept头是application / hal + json)。

您的应用程序的默认内容类型也可能是application / json。您可以通过以下配置类将默认内容类型更改为application / hal + json:

public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer c) {
        c.defaultContentType(MediaTypes.HAL_JSON);
    }
}

答案 2 :(得分:0)

我建议创建两个类,如Link和Self.Link有Self。自我具有模仿和模板化。 创建一个将链接形成为Java对象的类。 然后像GSON一样使用Java到Json库来获得与上面类似的输出

答案 3 :(得分:0)

如果您使用以下请求标头发出请求

  

接受:application / alps + json

你应该得到所希望的结果......

{
  "links" : [ {
    "rel" : "self",
    "href" : "http://localhost:8080"
  } ]
}

如果您通过以下方式提出请求:

接受:application / json

接受:application / hal + json

然后你会得到HAL(目前是默认的,见下面的链接)

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/persons{?page,size,sort}",
      "templated" : true
    }
  }
}

请参阅 https://github.com/spring-projects/spring-hateoas/blob/master/src/main/java/org/springframework/hateoas/config/EnableHypermediaSupport.java