来自 typescript/javascript 的 JSON.stringify 与 Java 控制器中的 json-String param/request-body 不匹配

Posted

技术标签:

【中文标题】来自 typescript/javascript 的 JSON.stringify 与 Java 控制器中的 json-String param/request-body 不匹配【英文标题】:JSON.stringify from typescript/javascript do not match json-String param/request-body in Java controller 【发布时间】:2021-07-30 04:31:51 【问题描述】:

我正在使用 jdk 1.8。我在 java 控制器中有一个休息端点:

@PostMapping("/filters")
public ResponseEntity<StatsDTO> listWithFilter(
      @RequestBody(required = false) String filter
) 
try  
   ...............


针对上述控制器的测试 sn-p 正在通过(在此 sn-p 中返回预期结果):

@Test
public void findReferralTest15() throws IOException 

   String result = webClient.post()
        .uri(endpoint(helper.entity + "/filters"))
        .contentType(MediaType.APPLICATION_JSON)
        .header(HttpHeaders.AUTHORIZATION, clientUser())
        .body(BodyInserters.fromObject(buildJsonForQuery15()))
        .exchange()
        .expectHeader().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
        .expectStatus().isOk()
        .expectBody(String.class).returnResult().getResponseBody();


   ObjectMapper mapper = new ObjectMapper();
   ResponseList referralList = mapper.readValue(result, ResponseList.class);
 

public String buildJsonForQuery15() 
    String json = "\"billType\":\"INTAKE\":true";
    return json;

现在,当我尝试与前端集成时(打字稿上的 Angular 7),我必须执行 JSON.stringify 两次 (到要作为 requestbody 提交的 json 对象或过滤器) 使其与后端一起工作。我得到 null 否则作为 java 控制器端的 "filter" (在请求正文中)的值。

所以使用 double JSON.stringify 从我们的前端提交的结果是 (WHEN IT WORKS):

"\"billType\":\"INTAKE\":true"

所以对于 single JSON.stringify 从我们的端提交的结果是 (WHEN IT DOESN'T WORK)

"billType":"INTAKE":true

问题:java 控制器中 requestBody "filter" 的数据类型应该是什么才能使其与单个 JSON.stringify 一起使用?

我尝试将 json.org.JsonObject 作为“过滤器”的数据类型,但没有任何区别。

提前致谢。

前端sn-p:

const fullUrl = `$this.referralsUrl/filters?first=$first&max=$max`;
const headerDict = 
  "Content-Type": "application/json; charset=utf-8",
  Accept: "application/json",
  "Access-Control-Allow-Headers": "Content-Type"
;
const headers = new HttpHeaders(headerDict);

 if (filters) 

  const requestBody = JSON.stringify(filters);
  return this.http
    .post<Page<ClinAssistReferral>>(fullUrl, JSON.stringify(requestBody),  headers )
    .pipe(
      map((data: any) => 
      ...........
      

【问题讨论】:

【参考方案1】:

如果正文不是动态的,则首选为请求创建 DTO。

如果body是动态的,我建议你试试jackson的JsonNode。看看这个库能不能

import com.fasterxml.jackson.databind.JsonNode;
...

@PostMapping("/filters")
public ResponseEntity<StatsDTO> listWithFilter(
      @RequestBody(required = false) JsonNode filter
) 
   try  
      var intake = filter.get("billType").get("INTAKE").asBoolean()
      ...............
   

【讨论】:

以上是关于来自 typescript/javascript 的 JSON.stringify 与 Java 控制器中的 json-String param/request-body 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript / JavaScript - 导入所有类型

ALM:TypeScript / JavaScript 的下一代 IDE

TypeScript -- JavaScript的救赎

拆分 csv 行并转换数值(Typescript、Javascript)

Node.js、TypeScript、JavaScript 和 Angular 之间的连接 [关闭]

在构造函数之前调用 Typescript/javascript 方法