如何在RequestBody中发送带有引号的字符串?

时间:2019-11-18 10:05:45

标签: java json angular rest

我有以下API方法:

@PatchMapping("/{id}")
  public ResponseEntity<?> partialProjectUpdate(@PathVariable long id, @RequestBody EntryStatus status) throws DailyEntryNotFoundException {
    return dailyEntryService.partialDailyEntryUpdate(id, status);
  }

EntryStatus是一个枚举:

public enum EntryStatus {
  OPEN,
  PROGRESS,
  CHECKED,
  BOOKED,
  UNAVAILABLE;

  private static Map<String, EntryStatus> namesMap = new HashMap<String, EntryStatus>(3);

  static {
    namesMap.put("OPEN", OPEN);
    namesMap.put("PROGRESS", PROGRESS);
    namesMap.put("CHECKED", CHECKED);
    namesMap.put("BOOKED", BOOKED);
    namesMap.put("UNAVAILABLE", UNAVAILABLE);
  }

  @JsonCreator
  public static EntryStatus forValue(String value) {
    return namesMap.get(value);
  }

  @JsonValue
  public String toValue() {
    for (Map.Entry<String, EntryStatus> entry : namesMap.entrySet()) {
      if (entry.getValue() == this)
        return entry.getKey();
    }

    return null; // or fail
  }
}

我在打字稿中这样调用该方法:

partialUpdateDailyEntry(dailyEntry: DailyEntry, status): Observable<any> {
    const statusName: string = status.name;
    return this.http.patch(BASE_URL + dailyEntry.id, statusName, this.authService.setHeaders('application/json'))
      .pipe(
        catchError(this.handleService.error)
      );
  }

statusName是一个字符串,但是问题在于它是通过JSON发送而没有引号的。例如,RequestBodyOPEN而不是"OPEN",这给了我以下错误:

JSON parse error: Unrecognized token 'OPEN': was expecting ('true', 'false' or 'null').

如前所述,这是由于发送字符串时没有引号引起的。

我可以通过手动将引号添加到statusName来解决该问题,如下所示:

const statusName: string = '"' + status.name + '"';

但是那不可能是正确的解决方案,有没有更好的方法呢?

3 个答案:

答案 0 :(得分:0)

尝试

@JsonFormat(shape = JsonFormat.Shape.STRING)
public enum EntryStatus{
    OPEN,
    PROGRESS,
    CHECKED,
    BOOKED,
    UNAVAILABLE;
}

答案 1 :(得分:0)

您正在添加要发送的标头JSON,但是"OPEN"不是有效的JSON值。

您应该更改标题:

this.authService.setHeaders('text/plain')

或更改发送方式:

this.http.patch(BASE_URL + dailyEntry.id, { status: statusName});

然后将您的Java后端更改为处理以接收对象并读取状态

或在发送前将其字符串化:

const statusName: string = JSON.stringify(status.name);

答案 2 :(得分:0)

也许您可以放上

namesMap.put(“ OPEN”,OPEN);

namesMap.put(“ \” OPEN \“”,OPEN);