gpt4 book ai didi

java - 无法使用 Spring HATEOAS 和 Jersey 进行 HAL 渲染

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:23:20 25 4
gpt4 key购买 nike

我使用 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;
}
}

和一个虚拟 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

但格式仍然错误(“链接”属性作为对象/ map 的“_links”属性的数组)。

最佳答案

只是添加@zerflagL 的答案,注册Jackson2HalModule,您应该使用ContextResolver,如前所述here .同样在此模块之上,您需要配置 HalHandlerInstantiator使用 ObjectMapper。如果您错过了最后一部分,您将得到关于 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());

关于java - 无法使用 Spring HATEOAS 和 Jersey 进行 HAL 渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35413633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com