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()); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |