【发布时间】:2019-11-18 10:05:45
【问题描述】:
我有以下 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 发送时不带引号。 RequestBody 是例如 OPEN 而不是 "OPEN" 这给了我以下错误:
JSON parse error: Unrecognized token 'OPEN': was expecting ('true', 'false' or 'null').
如前所述,这是由于字符串发送时不带引号引起的。
我可以通过手动将引号添加到statusName 来解决这个问题,如下所示:
const statusName: string = '"' + status.name + '"';
但这不是正确的解决方案,有更好的方法吗?
【问题讨论】: