我有以下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 + '"';
但是那不可能是正确的解决方案,有没有更好的方法呢?
答案 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);