[英]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.