Spring @RequestBody和Enum值
我有这个
public enum Reos { VALUE1("A"),VALUE2("B");
private String text;
Reos(String text){this.text = text;}
public String getText(){return this.text;}
public static Reos fromText(String text){
for(Reos r : Reos.values()){
if(r.getText().equals(text)){
return r;
}
}
throw new IllegalArgumentException();
}
}
还有一个名为Review的类,该类包含 类型的属性。
public class Review implements Serializable{ private Integer id;
private Reos reos;
public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public Reos getReos() {return reos;}
public void setReos(Reos reos) {
this.reos = reos;
}
}
最后,我有一个控制器,它使用 接收对象复审。
@RestControllerpublic class ReviewController {
@RequestMapping(method = RequestMethod.POST, value = "/reviews")
@ResponseStatus(HttpStatus.CREATED)
public void saveReview(@RequestBody Review review) {
reviewRepository.save(review);
}
}
如果我用
{"reos":"VALUE1"}
没有问题,但是当我用
{"reos":"A"}
我得到这个错误
Could not read document: Can not construct instance of com.microservices.Reos from String value 'A': value not one of declared Enum instance names: [VALUE1, VALUE2] at [Source: java.io.PushbackInputStream@23ce847a; line: 1, column: 40] (through reference chain: com.microservices.Review["reos"]); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of com.microservices.Reos from String value 'A': value not one of declared Enum instance names: [VALUE1, VALUE2] at [Source: java.io.PushbackInputStream@23ce847a; line: 1, column: 40] (through reference chain: com.microservices.Review["reos"])"
我理解了这个问题,但是我想知道一种告诉Spring的方法,对于每个带有Reos枚举的对象,请使用Reos.fromText()而不是Reos.valueof()。
这可能吗?
回答:
我找到了我所需要的。
http://chrisjordan.ca/post/50865405944/custom-json-serialization-for-enums-
using-jackson
这是两个步骤。
- 覆盖Reos枚举的toString方法
@Override public String toString(){返回文本;}
- 用@JsonCreator注释Reos枚举的fromText方法。
@JsonCreator公共静态Reos fromText(字符串文本)
就这样。
我希望这可以帮助其他面临相同问题的人。
以上是 Spring @RequestBody和Enum值 的全部内容, 来源链接: utcz.com/qa/434826.html