java - Micronaut HTTP 客户端 - 反序列化通用类型 - 用于 API 测试

标签 java junit jackson micronaut micronaut-client

对于 API 测试,我必须使用 io.micronaut.http.client.HttpClient 解析请求的响应

我更喜欢使用下面给出的格式。

Response<User> response =
                client.toBlocking().retrieve(HttpRequest.POST("/", user), Response.class);

但是它不起作用。我在尝试从响应中获取用户时遇到类型转换错误

User user = response.getUser();

目前我正在使用ObjectMapper (Jackson),如下所示,

String response = client.toBlocking().retrieve(HttpRequest.POST("/", user), String.class);
ObjectMapper objectMapper = new ObjectMapper();
Response<User> response = objectMapper.readValue(response, new TypeReference<Response<User>>() {});

有没有办法直接将TypeReferenceHttpClient检索方法一起使用?或者通过 HttpClient 使用泛型类类型的任何其他方式。

其他有用的信息

// Response generic class
class Response<T> {
T data;
....
}

响应示例

{
    "data": {
        "name":"sample"
    },
    "message": "Success"
}

最佳答案

您有多种选择:

如果您只需要那个User对象实例,您可以通过 retrieve() 来完成方法,其中第二个参数是域类(在您的情况下为 User ),然后您可以使用 user根据需要变量:

User user = client.toBlocking().retrieve(HttpRequest.POST("/", user), User.class);

assertThat(user)
    .isNotNull()
    .extracting(User::getName)
    .isEqualTo("sample");

如果您还需要响应对象(例如能够检查响应代码),那么您应该使用 exchange()方法然后得到User通过调用 body() 实例该响应的方法:

HttpResponse<User> response = client.toBlocking()
    .exchange(HttpRequest.POST("/", user), User.class);

assertThat(response)
    .isNotNull()
    .extracting(HttpResponse::body)
    .extracting(User::getName)
    .isEqualTo("sample");

更新:当您需要使用泛型类作为响应时,您必须使用 Argument.of()作为 retrieve() 的第二个参数和exchange()您可以在其中指定响应泛型类及其类型参数的方法。请参阅示例:

Response<User> response = client.toBlocking()
    .retrieve(HttpRequest.POST("/", user), Argument.of(Response.class, User.class));

assertThat(response)
    .isNotNull()
    .extracting(Response::getData)
    .extracting(User::getName)
    .isEqualTo("sample");

如果你没有 Argument.of() 就这样做那么它将转换 data属性(property)进入LinkedHashMap而不是User还有这个:

Response<User> response = client.toBlocking().retrieve(HttpRequest.POST("/", user), Response.class);
response.getData().getName();

...会抛出 ClassCastException :

java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class my.app.domain.User (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; my.app.domain.User.User is in unnamed module of loader 'app')

关于java - Micronaut HTTP 客户端 - 反序列化通用类型 - 用于 API 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61476579/

相关文章:

java - 使用 Jackson 无法识别 @JsonCreator

java - 访问 Capedwarf 上的 Cron 选项卡时出现 ServletException

JAVA:java可以检测其他正在打开的第三方应用程序吗

java - 如何管理同一项目中两个不同测试套件的 POM Surefire 插件

java - 尝试使用 JMockit 部分模拟类时,ClassLoader 抛出 NullPointerException

java - 如何根据关键字将解析的 JSON 消息的内容存储到字符串变量中?

java - 在Android推送通知中,当应用程序关闭时,我们如何获取点击托盘时的有效负载数据?

java - Liferay:RememberMe 不起作用

安卓工作室 : Can not find Run test choice

java - 如何配置 maven 和 intellij 以包含 groovy 和 java 的参数编译器标志