2017-06-08 11 views
1

Webサービスを作成するためにSpringブートを使用しています。私はエンティティAnimalと列挙型Kindを持っており、Kind.DOGまたはKind.CATのいずれかになります。 Animalクラスは、そのインスタンス変数の1つとして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に変換したいです"犬"または "猫"。今、私がDOGまたはCATを渡すとうまくいきますが、小文字の場合はうまくいきません。誰かが私に何をするか教えてもらえますか?

@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

私は両方のソリューションを試しましたが、違いはenumは直接 '@ RequestParam'ですが、私にとっては' @ RequestBody'のインスタンスです。 – ion20

+0

これを調べてみてください。あなたと同じ問題:https://stackoverflow.com/questions/33637427/spring-requestbody-and-enum-value –

答えて

0

InitBinderは、私の経験によれば@RequestBodyで動作しません。 私たちはSpring Bootを使用し、この問題を解決する方法は、最新のjacksonを使用できるように、すべてのjackson関連の依存関係をspring-boot-starter-webから除外しました。 spring.jackson.mapper.accept_case_insensitive_enums=true

場合:我々は我々だけapplication.propertiesファイルでこれを設定することができる新しいジャクソンのライブラリを持っていることを今

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

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

そして私は、最新のジャクソンの依存関係を追加しましたYAMLを使用する場合は、

spring: 
    jackson: 
    mapper: 
     accept_case_insensitive_enums: true 

インスピレーション:https://stackoverflow.com/a/44217670/1781024

関連する問題