当前位置: 首页 > 面试题库 >

使用spring-hateoas反序列化包含(_links和_embedded)的JSON

文国发
2023-03-14
问题内容

我正在尝试开发非常简单的json网络服务,以返回这种形式的数据:

{
    "_embedded": {
        "users": [{
            "identifier": "1",
            "firstName": "John",
            "lastName": "Doe",
            "_links": {
                "self": {
                    "href": "http://localhost:8080/test/users/1"
                }
            }
        },
        {
            "identifier": "2",
            "firstName": "Paul",
            "lastName": "Smith",
            "_links": {
                "self": {
                    "href": "http://localhost:8080/test/users/2"
                }
            }
        }]
    },
    "_links": {
     "self": {
       "href": "http://localhost:8080/test/users"
     }
   },
   "page": {
     "size": 20,
     "totalElements": 2,
     "totalPages": 1,
     "number": 0
   }
}

如您所见,这非常简单。我的POJO扩展了ResourceSupport,因此解析链接没有问题。它们是这样的:

UsersJson(根元素)

public class UsersJson extends ResourceSupport {
    private List<UserJson> users;

    [... getters and setters ...]
}

用户杰森

public class UserJson extends ResourceSupport {

    private Long identifier;

    private String firstName;

    private String lastName;

    [... getters and setters ...]
}

事实是,我期望jackson和spring足够聪明,可以解析_embedded属性并填充我的UsersJson.users属性,但事实并非如此。

我尝试了在互联网上发现的各种东西,但是我唯一能正常工作的是创建一个充当_embedded包装器的新类:

UsersJson(根元素)

public class UsersJson extends ResourceSupport {
    @JsonProperty("_embedded")
    private UsersEmbeddedListJson  embedded;

    [... getters and setters ...]
}

嵌入式“包装器”

public class UsersEmbeddedListJson extends ResourceSupport {
    private List<UserJson> users;

    [... getters and setters ...]
}

它有效,但我觉得它很丑。

但是我虽然可以使用RestTemplate的以下配置(特别是当我在Jackson2HalModule中看到EmbeddedMapper时),但没有成功:

        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.registerModule(new Jackson2HalModule());

        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json"));
        converter.setObjectMapper(mapper);

        RestTemplate restTemplate = new RestTemplate(Collections.singletonList(converter));

        ResponseEntity<UsersJson> result = restTemplate.getForEntity("http://localhost:8089/test/users", UsersJson.class, new HashMap<String, Object>());
        System.out.println(result);

有人可以告诉我我在想什么吗?


问题答案:

最后,我找到了一种更好的使用这些application / hal + json API的方法。

实际上,Spring hateoas提供了几乎可以使用的客户端:org.springframework.hateoas.client.Traverson。

Traverson traverson = new Traverson(new URI("http://localhost:8080/test"), MediaTypes.HAL_JSON);
TraversalBuilder tb = traverson.follow("users");
ParameterizedTypeReference<Resources<UserJson>> typeRefDevices = new ParameterizedTypeReference<Resources<UserJson>>() {};
Resources<UserJson> resUsers = tb.toObject(typeRefDevices);
Collection<UserJson> users= resUsers .getContent();

如您所见,我摆脱了UsersJson和UsersEmbeddedListJson。

这是我添加的Maven依赖项

    <dependency>
        <groupId>org.springframework.hateoas</groupId>
        <artifactId>spring-hateoas</artifactId>
        <version>0.19.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.plugin</groupId>
        <artifactId>spring-plugin-core</artifactId>
        <version>1.2.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.jayway.jsonpath</groupId>
        <artifactId>json-path</artifactId>
        <version>2.0.0</version>
    </dependency>


 类似资料:
  • 我试图调用一个restendpoint,它返回一个pojo对象,如下所示: 以下是电话: 问题是我已经尝试了一些方法,例如忽略 OffsetDateTime 属性或尝试更改该日期的格式,但它会引发此错误: 否则它将返回空:(解决这个问题的好解决方案是什么?

  • 问题内容: 我是C ++的新手。使用序列化和反序列化类型数据的最简单方法是什么。我发现了一些使用示例,但它们对我来说是晦涩的。 问题答案: 请注意,将键解释为路径,例如,将对“ ab” =“ z”放置将创建{“ a”:{“ b”:“ z”}} JSON,而不是{“ ab”:“ z”} 。否则,使用是微不足道的。这是一个小例子。

  • 我正在使用sping-boot-2.2.1和sping-HATEOAS。超媒体链接工作正常,但是我在返回链接时看到了属性,请在这里找到下面的代码作为参考和github中的项目, 终点: a)将返回集合模型= 和 b) 将返回列表 控制器。Java 实际反应 预期反应: 我试过了 Spring数据RestdefaultMediaType=application/json spring.hateoas

  • 本文向大家介绍js序列化和反序列化的使用讲解,包括了js序列化和反序列化的使用讲解的使用技巧和注意事项,需要的朋友参考一下 (1)序列化 即js中的Object转化为字符串 1.使用obj.toJSONString() 2.使用JSON.stringify(obj) (2)反序列化 即js中JSON字符串转化为Object 1.使用eval('('+josnStr+')') 为什么要 eval这里

  • 问题内容: 你好(对不起我的英语) 我正在开发使用Spring SPRING MVC的json前端网站消耗Web服务的Web服务。spring mvc使用JsonIdentityInfo选项进行序列化,因此每个对象仅在json中写入一次,并且每次都使用引用进行写入,例如她使用相同的对象“ component”有2个“ computer”,因此spring将ID设置为第一个组件(“ @compone

  • 试图将JSON反序列化为我创建的Java bean。对杰克逊和这项努力来说真的很新鲜,所以请容忍我。我有以下几点: 由于JSON中的对象被反复使用,我的Java Bean被分解为几个部分,因此: ...和以类似方式实现的另一个BlockBean类(为简洁起见省略)。我使用杰克逊来完成这个任务,我的问题是——杰克逊中是否有序列化和反序列化的机制?理想情况下,我想要这样的东西(下面是伪代码,因为我无法