source

Spring Boot 컨트롤러의 열거형 무시 사례 역직렬화

factcode 2023. 6. 28. 22:01
반응형

Spring Boot 컨트롤러의 열거형 무시 사례 역직렬화

쿼리 매개 변수로 열거된 Spring Boot 끝점이 있습니다.

@GetMapping("/example")
public List<Example> getByEnum(@RequestParam(name = "exampleEnum", required = false) ExampleEnum exampleEnum) {
    // code
}

및 열거 클래스:

public enum ExampleEnum {
    FIRST,
    SECOND,
}

대문자 열거값을 끝점에 전달하면 역직렬화가 잘되지만 소문자에 대한 오류가 발생합니다.

java.lang.IllegalArgumentException: No enum constant 

Spring Boot Rest 끝점에서 열거형 무시 사례를 역직렬화하는 방법은 무엇입니까?

이 질문은 쿼리 매개 변수 역직렬화와 관련이 있으므로 중복되지 않습니다.

편집: 아래 답변이 올바르지 않습니다.사용자 정의를 정의해야 합니다.PropertyEditorSpring에 등록합니다.@InitBinder가 이 게시물에서 설명한 것입니다.@Dave 님께서 댓글로 이렇게 지적해주셔서 감사합니다.


Spring Boot 2.0은 ACCEPT_CASE_INSENT_ENUMS 기능이 있는 Jackson 2.9를 사용하고 있습니다.설정하여 활성화할 수 있어야 합니다.

spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_ENUMS = true 

부록 A의 문서에 따른 재산.

import com.fasterxml.jackson.annotation.JsonCreator;
import java.util.Arrays;
import java.util.Optional;

public enum ExampleEnum {
    FIRST,
    SECOND;

    @JsonCreator
    public static ExampleEnum setValue(String key) {
        return Arrays.stream(ExampleEnum.values())
            .filter(exampleEnum -> exampleEnum.toString().equals(key.toUpperCase()))
            .findAny()
            .orElse(null);
}

모든 열거형에 대해 일반 변환기를 만들 수 있습니다.

package ru.grancall.kb.logging.service.dto.converter;

import lombok.AllArgsConstructor;
import org.apache.commons.lang3.EnumUtils;
import java.beans.PropertyEditorSupport;

@AllArgsConstructor
public class EnumConverter extends PropertyEditorSupport {
    private Class type;

    public void setAsText(String text) {
        setValue(EnumUtils.getEnum(type, text.toUpperCase()));
    }
}

그런 다음 컨트롤러에서 다음을 사용합니다.

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

대소문자를 구분하지 않고 모든 열거형을 처리하려면 Spring의 Application Conversion Service를 사용할 수 있습니다.

다음과 같은 작은 구성으로만 등록하면 됩니다(배들둥 참조).

@Configuration
public class EnumMappingConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        ApplicationConversionService.configure(registry);
    }
}

언급URL : https://stackoverflow.com/questions/50231233/deserialize-enum-ignoring-case-in-spring-boot-controller

반응형