当前位置: 首页 > 知识库问答 >
问题:

使用泛型将正文传递到安全状态不适用于File和FileInputStream

曹沛
2023-03-14

在restasured中,我们可以通过不同的方式在body方法中传递请求负载,如

  1. 字符串
  2. POJO对象
  3. 地图对象
  4. JsonObject(来自GSON库)
  5. 文件和
  6. 文件输入流

因此,我使用泛型创建了以下一种方法来适应所有这些类型:-

public <T> Response postAMember(T body) {

    return given().spec(this.spec).body(body).when().post(EndPoints.GET_ALL_POST_A_MEMBER).andReturn();
}

现在,这是我如何为各自的类型消费它(不是一次全部...一次一个):-

@Test
public void postMember() throws IOException {
    // Using Hashmap
    Map<String, String> body = new HashMap<>();
    body.put("name", "Rocky");
    body.put("gender", "Male");
    
    // Using Model and GSON
    Member imember = new Member("Rocky", "Male");
    Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
    String body = gson.toJson(imember);
    
    // Using JsonObject (GSON)
    JsonObject body = new JsonObject();
    body.addProperty("name", "Rocky");
    body.addProperty("gender", "Male");
    
    // Using Payload JSON File
    File body = new File("src/test/resources/Payloads/postmemberpayload.json");
    
    // Using Raw String
    String body = "{\r\n" + 
            "   \"name\": \"Rocky\",\r\n" + 
            "   \"gender\": \"Male\"\r\n" + 
            "}";
    
    // Using FileInputStream
    FileInputStream fis = new FileInputStream(body); // in this case I would pass fis to body method
    
    Response resp = MemberService.getMemberServiceInstance().postAMember(body);
    Assert.assertEquals(resp.getStatusCode(), StatusCode.CREATED_201);
    Member omember = resp.getBody().as(Member.class);

    System.out.println(omember.toString());

}

postAMember方法仅适用于:-

  1. 字符串
  2. POJO对象
  3. 地图对象
  4. JsonObject(来自GSON库)

但失败,其余两个: -

现在,我必须为postAMember编写两个重载版本

public Response postAMember(File body) {

    return given().spec(this.spec).body(body).when().post(EndPoints.GET_ALL_POST_A_MEMBER).andReturn();
}

public Response postAMember(FileInputStream body) {

    return given().spec(this.spec).body(body).when().post(EndPoints.GET_ALL_POST_A_MEMBER).andReturn();
}

现在,上面有两个方法生成响应。任何线索,这是怎么回事?为什么具有泛型的方法不能采用File和FileInputStream?

我从maven central repo获取了最新的重新发行的库。

共有1个答案

余天宇
2023-03-14

据我所知,您的泛型方法将映射到< code > request specification 的< code>body(Object object),然后这个< code>object将被序列化。

class RequestSpecificationImpl
...

  RequestSpecification body(Object object) {
    ...

    this.requestBody = ObjectMapping.serialize(object, requestContentType, 
               findEncoderCharsetOrReturnDefault(requestContentType), null, 
               objectMappingConfig(), restAssuredConfig().getEncoderConfig());
    ...
  }

以下所有类型的对象序列化都没有问题。

  • 字符串
  • POJO 对象
  • 地图对象
  • JsonObject(来自GSON库)

但是

  • 文件---序列化---

当你添加2个方法时,那么放心正确地映射到body(文件正文)body(InputStream body)--

 类似资料:
  • 我想通过一个自定义的泛型unapply函数压缩我的计算器,该函数计算参数并在成功时返回值。 但是这失败了,错误 有什么方法可以实现这一点吗?我已经研究了类型标签,不适用方法的隐式转换,但我不知道如何将它们集成到这个问题中。如何正确定义Eval?

  • 因此,作为一个初学者,我曾尝试使用spring boot 2.2.11、spring security、thymeleaf和json web令牌创建一个ecommmerce网站,我的问题是,当用户对模板进行身份验证时,即使我在模板中放置了thymeleaf的isAnonyms和IsAuthentificated标记,模板也没有更改。 我有两个问题: 1-/如何告诉所有控制器用户已经登录? 2-/如

  • 但是控制台显示一个错误: 未捕获的 DOMException:无法在 “History” 上执行 'pushState':无法克隆 Symbol(react.element)。 这是什么意思?对此我能做些什么?

  • 问题内容: 我希望能够使用ui-router转换为状态并传递任意对象。 我知道通常会使用它,但是我相信此值会插入URL中,并且我不希望用户能够对此数据添加书签。 我想做这样的事情。 有没有办法在不将值编码到URL的情况下执行此操作? 问题答案: 在0.2.13版中,您应该可以将对象传递到$ state.go, 然后访问控制器中的参数。 myParam将不会显示在URL中。 资源: 请参阅chris

  • 我正在尝试设置Firebase规则,如果$uid等于auth,则该规则将授予对R/W的访问权限。uid。我用firebase phone auth登录。 我正在尝试这条规则: 这条规则: 我尝试访问数据时出错(权限被拒绝)。 我遵循Firebase的说明,此规则通过模拟器。 当这些规则到位时,我不会从Firebase获得带有快照的实例。 如果你能帮助解决这个问题,我将不胜感激。 我正在尝试授予读取

  • 问题内容: 我有课 和班级 关键是该方法不安全,因为我可以提供的项目与当前报告无关,但与其他报告相关,编译器不会抱怨。 是否可以用类型安全的方式编写该方法,即我们可以仅将T作为当前报表的类型作为参数传递。 问题答案: 我认为您正在寻找以下内容。 它的工作方式是: 您想用从 您要确保所有列表都属于同一类型 为了将参数绑定到从扩展的对象,您需要对自身进行参数化: 您添加需要从报表扩展的绑定 但是您要