2017-06-08 47 views
1

我正在使用Spring Boot編寫Web服務。我有一個實體Animal和枚舉Kind可以是Kind.DOGKind.CATAnimal類包含private Kind kind作爲其實例變量之一。當我發出HTTP請求,我通過在一個字符串值kind並且當所述請求映射到標頭:將字符串值綁定到Spring引導中的@RequestBody實體中的枚舉

@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())); 
    } 

} 

,但沒有奏效。

+0

看看從這篇文章接受的答案:https://stackoverflow.com/questions/39774427/springs-requestparam-with-enum –

+0

我試過這兩種解決方案,但我認爲不同的是,他們的枚舉是一個直接的'@ RequestParam',但對我來說,它是'@ RequestBody'的一個實例。 – ion20

+0

然後試着看看這個。與您的問題相同:https://stackoverflow.com/questions/33637427/spring-requestbody-and-enum-value –

回答

0

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> 

然後我加入了最新的傑克遜依賴關係:

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

現在,我們有我們就可以設置這個在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