我用了Spring初始化器(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"
}
]
}
除了初始化器生成的类之外,我还添加了这个配置
@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
但格式仍然错误(“link”属性作为数组,而“\u links”属性作为对象/映射)。
Spring HATEOAS是为与Spring MVC配合使用而开发的。所有与JSON序列化/反序列化相关的内容都是为Spring MVC注册的,准确地说是映射Jackson2HttpMessageConverter。
如果你想要同样的球衣,你必须设置Jackson,以便组织。springframework。哈提奥斯。哈尔。Jackson2HalModule注册。
只是要添加到@zerfraL的答案中,要注册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;
}
}
然后只需将上下文解析器注册到您的泽西ResourceConfig
register(new JacksonContextResolver());
我正在开发restful Web服务,但遇到以下错误: Java语言lang.ClassNotFoundException:com。太阳运动衫spi。容器servlet。ServletContainer服务容器 我知道这类问题有很多话题。我已经检查了它们并尝试了它们的解决方案,但我得到的错误仍然存在。 这是我的pom。xml: 这是我的网站。xml: 下面是完整的堆栈跟踪: 感谢您的帮助。
我只是想学习,构建一个Spring HATEOAS应用程序。 我已将自定义查询添加到我的存储库中: 我得到了很好的JSON响应,但由于这是可分页的,我想要一个链接部分。。。使用上一个/下一个。 我该如何添加它? 主url提供了所有客户的列表,链接没有问题,我只想将这些链接添加到自定义可分页方法。 --编辑-- 啊! 使findAllFitered方法返回一个页面而不是列表。。。
我一直在检查类似的问题,没有找到任何解决我所观察到的问题的答案。 问题是,当我检索1个资源时,我很容易在我的REST API中获得HAL格式的超媒体,但当我遇到检索实体列表的控制器方法时,超媒体就不一样了。 以下是输出: > 返回的单个资源 “\u links”:{“self”:{“href”:”http://localhost:8080/celsvs/api/books/123567891099
问题内容: 我正在使用Jersey 2.22.1和Jackson 2.6.3编写Web应用程序。我的pom.xml看起来像这样: 目标是将不同的自定义ObjectMappers用于JSON和XML映射。我创建了两个提供程序类:JSONMapperProvider 和XMLMapperProvider 它们都在同一包中,并在Application资源类中注册 如果我向@Produces(MediaT
我们使用nextjs/reactjs作为FE,并且我们有一个server.js文件,它允许我们在上传映像,但是由于某种原因,每当我们运行服务器时,都会出现错误 下面是我们在server.js上的代码 这些是我们package.json中包含的脚本 希望得到一些答案和建议。这些代码在本地运行,没有任何问题
我正在创建一个电子学习网站,那里有你可以选择的课程卡片。这是我的密码 课程ist.vue 我的问题是我无法从API链接获取数据- 我想知道我做错了什么。我也尝试使用{{list}}来获取数据,但没有成功。我现在的目标是得到所有的数据,即使它看起来很乱。抱歉我英语不好,谢谢你!