簡體   English   中英

使用Spring HATEOAS和Jersey無法獲得HAL渲染

[英]Can't get HAL rendering with Spring HATEOAS and Jersey

我使用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",
    "count": 42,
    "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 ,提到這里 此外,在此模塊的頂部,您需要使用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());

Spring HATEOAS開發用於Spring MVC。 與JSON序列化/解除相關的所有內容都是為Spring MVC注冊的, MappingJackson2HttpMessageConverter是精確的。

如果你想要澤西島的相同,你必須設置傑克遜,以便org.springframework.hateoas.hal.Jackson2HalModule得到注冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM