[英]Bind a String value to an enum in a @RequestBody entity in Spring Boot
我使用Spring Boot編寫Web服務。 我有一個實體Animal
和一個enum Kind
,可以是Kind.DOG
或Kind.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
如果我不是“狗”或“貓”正在過去。 現在,如果我傳入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()));
}
}
但它不起作用。
根據我的經驗, 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.