java - Spring @RequestBody 和枚举值

标签 java spring spring-mvc enums

我有这个枚举

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 的类,该类包含 enum Reos 类型的属性。

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;
    }
}

最后我有一个 Controller ,它通过 @RequestBody 接收对象审查。

@RestController
public class ReviewController {

    @RequestMapping(method = RequestMethod.POST, value = "/reviews")
    @ResponseStatus(HttpStatus.CREATED)
    public void saveReview(@RequestBody Review review) {
        reviewRepository.save(review);
    }
}

如果我用

调用 Controller
{"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 .

这是两步。

  1. 重写 Reos 枚举的 toString 方法
@Override
public String toString() {
    return text;
}
  1. 使用 @JsonCreator 注释 Reos 枚举的 fromText 方法。
@JsonCreator
public static Reos fromText(String text)

仅此而已。

我希望这可以帮助其他面临同样问题的人。

关于java - Spring @RequestBody 和枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33637427/

相关文章:

java - 从抽象类的子类调用 toString() 方法,会抛出 stackoverflowerror 异常

java - spring bean id 值可以有 $ 吗?

java - Spring Boot Controller 处理无效 JSON

java - Spring boot在webapp文件夹下找不到index.html

java - Spring MVC 3 简单表单 Controller

java - 定时器测量数组排序

java - 从具有匹配名称的 List<Student> 中获取 Student 对象而不进行迭代 (Java)

java - 使用 Joda Time 将 DateTime 减去 1 小时

spring - CDI @ViewScoped bean 功能不可用

java - 如何在 freemarker 模板中转义来自 web 服务的数据中的 '&' ?