簡體   English   中英

將一個String值綁定到Spring Boot中@RequestBody實體的枚舉

[英]Bind a String value to an enum in a @RequestBody entity in Spring Boot

我使用Spring Boot編寫Web服務。 我有一個實體Animal和一個enum Kind ,可以是Kind.DOGKind.CAT Animal類包含private Kind kind作為其實例變量之一。 當我提出的HTTP請求,我通過在對一個字符串值kind以及當所述請求映射到標頭:

@RequestMapping(method=RequestMethod.POST, value="/create") public ResponseEntity<Animal> createAnimal(@RequestBody Animal animal)

我想kind被內部轉換為Kind.DOG / Kind.CAT如果我不是“狗”或“貓”正在過去。 現在,如果我傳入DOGCAT ,它可以正常工作,但如果是小寫則沒有。 誰能告訴我該怎么做? 我嘗試了以下方法:

@InitBinder
public void initBinder(WebDataBinder dataBinder) {
    dataBinder.registerCustomEditor(Kind.class, new KindEnumConverter());
}

@RequestMapping(method=RequestMethod.POST, value="/create")
public ResponseEntity<Animal> createAnimal(@RequestBody Animal animal)

public class KindEnumConverter extends PropertyEditorSupport {

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        setValue(Kind.valueOf(text.toUpperCase()));
    }

}

但它不起作用。

根據我的經驗, InitBinder不能與@RequestBody一起使用。 我們使用Spring Boot和我解決這個問題的方式是,我從spring-boot-starter-web排除了所有與jackson相關的依賴關系,這樣我就可以使用最新的jackson了。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </exclusion>
    </exclusions>
</dependency>

然后我添加了最新的jackson依賴項:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.1</version>
</dependency>

現在我們有了新的jackson庫,我們可以在application.properties文件中設置它: spring.jackson.mapper.accept_case_insensitive_enums=true

如果你使用YAML,那么:

spring:
  jackson:
    mapper:
      accept_case_insensitive_enums: true

靈感: https//stackoverflow.com/a/44217670/1781024

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM