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

无法使用Spring HATEOAS和Jersey获取HAL渲染

徐学潞
2023-03-14

我用了Spring初始化器(https://start.spring.io/)来创建一个只包含初学者“Jersey(JAX-RS)”和“HATEOAS”的应用程序。然后我添加了@EnableHypermediaSupport(type=HAL),但我无法以HAL格式正确呈现链接。

我的目标格式是:

{
    "name": "Hello",
    "count": 42,
    "_links": {
        "self": {
            "href": "http://localhost:8080/api/foo"
        }
    }
}

我目前得到的是:

{
    "name": "Hello",
    "count": 42,
    "links": [
        {
            "rel": "self",
            "href": "http://localhost:8080/api/foo"
        }
    ]
}

除了初始化器生成的类之外,我还添加了这个配置

@Configuration
@ApplicationPath("api")
@Component
@EnableHypermediaSupport(type = HAL)
public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        registerEndpoints();
    }

    private void registerEndpoints() {
        register(FooResource.class);
    }
}

此资源(终结点):

@Component
@Path("foo")
public class FooResource {

    @GET
    @Produces(MediaTypes.HAL_JSON_VALUE)
    public Resource<Foo> getFoo() {

        final Resource<Foo> fooTo = new Resource<>(new Foo("Hello", 42));

        fooTo.add(JaxRsLinkBuilder.linkTo(FooResource.class).withRel("self"));

        return fooTo;
    }
}

和一个虚拟bean:

public class Foo {
    private String name;
    private int count;

    public Foo() {
    }

    public Foo(String name, int count) {
        this.name = name;
        this.count = count;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

我还试着加了

@EnableHypermediaSupport(type = HAL)

在应用程序类的@SpringBootApplication旁边。

当我

GET localhost:8080/api/foo

我得到了正确内容类型的回复

application/hal+json;charset=UTF-8

但格式仍然错误(“link”属性作为数组,而“\u links”属性作为对象/映射)。

共有2个答案

南宫凡
2023-03-14

Spring HATEOAS是为与Spring MVC配合使用而开发的。所有与JSON序列化/反序列化相关的内容都是为Spring MVC注册的,准确地说是映射Jackson2HttpMessageConverter。

如果你想要同样的球衣,你必须设置Jackson,以便组织。springframework。哈提奥斯。哈尔。Jackson2HalModule注册。

孔斌
2023-03-14

只是要添加到@zerfraL的答案中,要注册Jackson2HalModule,您应该使用ContextResolver,如这里所述。此外,在此模块之上,您需要使用ObjectMapper配置HalHandlerInstantiator。如果您错过了最后一部分,您将获得有关Jackson由于没有默认构造函数而无法实例化序列化器的异常。

@Provider
public class JacksonContextResolver implements ContextResolver<ObjectMapper> {

    private final ObjectMapper mapper = new ObjectMapper();

    public JacksonContextResolver() {
        mapper.registerModule(new Jackson2HalModule());
        mapper.setHandlerInstantiator(new HalHandlerInstantiator(
                new AnnotationRelProvider(), null, null));
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return mapper;
    }
}

然后只需将上下文解析器注册到您的泽西ResourceConfig

register(new JacksonContextResolver());
 类似资料:
  • 我正在开发restful Web服务,但遇到以下错误: Java语言lang.ClassNotFoundException:com。太阳运动衫spi。容器servlet。ServletContainer服务容器 我知道这类问题有很多话题。我已经检查了它们并尝试了它们的解决方案,但我得到的错误仍然存在。 这是我的pom。xml: 这是我的网站。xml: 下面是完整的堆栈跟踪: 感谢您的帮助。

  • 我一直在检查类似的问题,没有找到任何解决我所观察到的问题的答案。 问题是,当我检索1个资源时,我很容易在我的REST API中获得HAL格式的超媒体,但当我遇到检索实体列表的控制器方法时,超媒体就不一样了。 以下是输出: > 返回的单个资源 “\u links”:{“self”:{“href”:”http://localhost:8080/celsvs/api/books/123567891099

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

  • 问题内容: 我正在使用Jersey 2.22.1和Jackson 2.6.3编写Web应用程序。我的pom.xml看起来像这样: 目标是将不同的自定义ObjectMappers用于JSON和XML映射。我创建了两个提供程序类:JSONMapperProvider 和XMLMapperProvider 它们都在同一包中,并在Application资源类中注册 如果我向@Produces(MediaT

  • 我们使用nextjs/reactjs作为FE,并且我们有一个server.js文件,它允许我们在上传映像,但是由于某种原因,每当我们运行服务器时,都会出现错误 下面是我们在server.js上的代码 这些是我们package.json中包含的脚本 希望得到一些答案和建议。这些代码在本地运行,没有任何问题

  • 问题内容: 我是一个新用户,正在尝试此命令。 我得到这个错误 我知道这似乎是一个琐碎的问题,但我坚持下去。 问题答案: 如果编译和安装的代码是 不是 在分支(签出由默认值),但只有在该回购的分支,尝试: 然后重试编译。