加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 无法使用Spring HATEOAS和Jersey获得HAL渲染

发布时间:2020-12-15 04:32:25 所属栏目:Java 来源:网络整理
导读:我使用 Spring Initializr( https://start.spring.io/)来创建一个只有“Jersey(JAX-RS)”和“HATEOAS”的首发应用程序. 然后我添加了@EnableHypermediaSupport(type = HAL),但我无法以HAL格式正确呈现链接. 我的目标是: { "name": "Hello","count": 42,"_li
我使用 Spring Initializr( 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","links": [
        {
            "rel": "self","href": "http://localhost:8080/api/foo"
        }
    ]
}

除了initializr生成的类之外,我还添加了这个配置

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

和一个虚拟豆:

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

但仍然是错误的格式(“链接”属性作为数组instaed的“_links”属性作为对象/地图).

解决方法

只是为了添加@zerflagL的答案,要注册Jackson2HalModule,你应该使用一个ContextResolver,如 here所述.另外在这个模块的顶部,你需要使用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;
    }
}

然后只需使用Jersey ResourceConfig注册上下文解析器

register(new JacksonContextResolver());

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读