如何使用Spring HATEOAS更改HAL链接格式

24

我正在使用Spring HATEOAS(0.16.0.RELEASE)构建Spring REST应用程序,我希望JSON链接的输出看起来像:

_links: {
   self: {
     href: "https://<ip>/api/policies/321"
   }
}

虽然它的呈现方式如下:

   "links":
      [{
       "rel":"self",
       "href":"http://<ip>/api/policies/321"
      }]

我正在使用HATEOAS ResourceResourceAssembler

为什么我得到这种格式而不是另一种格式?我该如何更改它?


我猜这取决于你使用的序列化器来构建HAL响应。它是符合HAL规范的,因此一个好的HAL解析器可以处理它... - inf3rno
我会检查一下,也许我对HAL规范有不完美的记忆。 - inf3rno
1
是的,你说得对。我想我在阅读你的代码时有些匆忙了。你的示例具有collection+json结构,而不是hal+json。所以我猜你正在使用错误的类来生成json响应。通过hal,你使用_links和一个对象,其中键是链接关系,值可以是链接数组或单个链接。通过collection+json,你使用links,它是一个链接数组。 - inf3rno
在这里阅读手册:https://github.com/spring-projects/spring-hateoas,这是Spring HATEOAS的纯JSON格式。(它类似于collection+json,但乍一看我不认为是这样。)如果您想构建HAL响应,则需要使用不同的类或不同的设置。这些信息在手册中的某个地方,但对我来说太长了,因为我不开发Java,也许有时间再尝试Android作为另一个爱好... - inf3rno
如果EnableHypermediaSupport对您不起作用,那么您可能遇到了一些奇怪的问题。您能否提供您所有的@Configuration和@Controller? - Chris DaMour
显示剩余2条评论
2个回答

12
为了将HAL作为我们RESTful API的消息格式语言,并启用自动分页,我们需要在应用程序中进行一些配置更改。由于Spring Data和Spring HATEOAS已经提供了用于配置的注释,我们只需要添加这些注释即可。请注意,保留html标记。
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
@EnableHypermediaSupport(type = { HypermediaType.HAL })
@ComponentScan(basePackages = {
        "com.jiwhiz.rest"
})
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer c) {
        c.defaultContentType(MediaTypes.HAL_JSON);
    }
}

@EnableSpringDataWebSupport会增加对分页的支持,@EnableHypermediaSupport(type = { HypermediaType.HAL })会增加超媒体支持。然后我们将默认内容类型设置为application/hal+json。
引自:与Yuan Ji一起设计和构建使用Spring HATEOAS的RESTful API

我看到你一直在调查这个问题...谢谢! 你提到的博客就是我一直在关注的,我的应用程序配置就像你上面写的一样。但是,我的响应格式仍然是我写的那样 :-( - Tony Arad Felik
抱歉,朋友,我不能帮忙了,我只有几个月的Java经验。尝试通过Spring HATEOAS的GitHub页面创建一个问题,我认为他们可以提供帮助。 - inf3rno
1
我遇到了同样的问题。我花了一天的时间才找出问题所在。但当我将WebConfig实例化为@Bean而不是导入配置时,它就能正常工作...非常奇怪。 - Nathanael
该引用现在位于https://www.jiwhiz.com/blogs/Design_and_Build_RESTful_API_with_Spring_HATEOAS。 - afaulconbridge

1

请确保使用 com.fasterxml.jackson 依赖,而不是其他的依赖,如 org.codehaus.jackson。例如,在 Maven 的 pom.xml 中:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.5.3</version>
        </dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接