我有一個列舉定義為:
public static enum State {
@JsonProperty("At Rest")
AT_REST,
@JsonProperty("In Motion")
IN_MOTION,
@JsonProperty("Stalled")
STALLED;
}
因此,當 Jackson 將 AT_REST 列舉序列化為 JSON 時,服務器會生成“At Rest”。同樣,當客戶端將 JSON 傳遞給服務器時,Jackson 將“At Rest”反序列化為 AT_REST。例如:
@GetMapping()
public State[] getAllStates() {
return State.values(); //returns JSON ["At Rest", "In Motion", "Stalled"]
}
@PostMapping()
public void saveState(@ResponseBody State state /*when client sends "At Rest", it gets converted into Enum*/) {
//save state
}
我也有一個搜索 GET 端點。客戶端使用“狀態”查詢引數呼叫它,例如https://localhost/search?state=At Rest. 由于查詢引數值不是 JSON,所以我有一個 Spring 轉換器:
@Component
public class StringToStateConverter implements Converter<String, State> {
@Override
public State convert(String description) {
if ("At Rest".equals(description)) {
return State.AT_REST;
} else if ("In Motion".equals(description)) {
return State.IN_MOTION;
} else if ("Stalled".equals(description)) {
return State.STALLED;
} else {
return null;
}
}
}
反序列化查詢引數時是否可以讓 Spring 使用 JsonProperty?如果沒有,如何避免在代碼中的多個位置出現字串描述?我不想在列舉中創建描述欄位,因為這實際上只是用于客戶端顯示。
uj5u.com熱心網友回復:
反序列化查詢引數時是否可以讓 Spring 使用 JsonProperty?
是的。
@Component
@RequiredArgsConstructor
public class StringToStateConverter implements Converter<String, State> {
private final ObjectMapper mapper;
@Override
public State convert(String description) {
try {
return mapper.readValue("\"" description "\"", State.class);
} catch (JsonProcessingException e) {
// code to return error to client
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/528235.html
