1. 소개

대부분의 일반적인 웹 애플리케이션에서는 요청 매개 변수를 사전 정의 된 값 세트로 제한해야하는 경우가 많습니다. 열거 형은이를 수행하는 좋은 방법입니다.

이 빠른 예제에서는 Spring MVC에서 웹 요청 매개 변수로 열거 형을 사용하는 방법을 보여줄 것입니다.

2. 열거 형을 요청 매개 변수로 사용

먼저 예제에 대한 열거 형을 정의하겠습니다.

public enum Modes {
    ALPHA, BETA;
}

그런 다음이 열거 형을 Spring 컨트롤러에서 RequestParameter 로 사용할 수 있습니다 .

@GetMapping("/mode2str")
public String getStringToMode(@RequestParam("mode") Modes mode) {
    // ...
}

또는 PathVariable 로 사용할 수 있습니다 .

@GetMapping("/findbymode/{mode}")
public String findByEnum(@PathVariable("mode") Modes mode) {
    // ...
}

/ mode2str? mode = ALPHA 와 같은 웹 요청을 할 때 요청 매개 변수는 String 객체입니다. Spring은 StringToEnumConverterFactory 클래스 를 사용 하여이 String 객체를 Enum 객체 로 변환 할 수 있습니다 .

백엔드 변환은 Enum.valueOf 메서드를 사용합니다 . 따라서 입력 이름 문자열은 선언 된 열거 형 값 중 하나와 정확히 일치해야합니다 .

열거 형 값 중 하나와 일치하지 않는 문자열 값 ( 예 : / mode2str? mode = unknown)  으로 웹 요청을하면 Spring은 지정된 열거 형 유형으로 변환하지 못합니다. 이 경우, 우리는거야 ConversionFailedException을 .

3. 사용자 지정 변환기

Java에서는 상수이기 때문에 대문자로 열거 형 값을 정의하는 것이 좋습니다. 그러나 요청 URL에 소문자를 지원할 수 있습니다.

이 경우 사용자 지정 변환기를 만들어야합니다.

public class StringToEnumConverter implements Converter<String, Modes> {
    @Override
    public Modes convert(String source) {
        return Modes.valueOf(source.toUpperCase());
    }
}

사용자 정의 변환기를 사용하려면 Spring 구성에 등록 해야 합니다 .

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToEnumConverter());
    }
}

4. 예외 처리

StringToEnumConverterEnum.valueOf  메서드는 Modes 열거 형에 일치하는 상수가없는 경우 IllegalArgumentException 을 throw합니다 . 사용자 지정 변환기에서 요구 사항에 따라 다른 방식으로이 예외를 처리 할 수 ​​있습니다.

예를 들어, 변환기 가 일치하지 않는 String에 대해 null반환하도록 할 수 있습니다 .

public class StringToEnumConverter implements Converter<String, Modes> {
    @Override
    public Modes convert(String source) {
        try {
            return Modes.valueOf(source.toUpperCase());
        } catch (IllegalArgumentException e) {
            return null;
        }
    }
}

그러나 사용자 정의 변환기에서 예외를 로컬로 처리하지 않으면 Spring은 호출하는 컨트롤러 메서드에 ConversionFailedException 예외를 throw합니다 . 이 예외를 처리하는 방법 에는 여러 가지가 있습니다 .

예를 들어 전역 예외 처리기 클래스를 사용할 수 있습니다.

@ControllerAdvice
public class GlobalControllerExceptionHandler {
    @ExceptionHandler(ConversionFailedException.class)
    public ResponseEntity<String> handleConflict(RuntimeException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

5. 결론

이 기사에서는 몇 가지 코드 예제와 함께 Spring에서 요청 매개 변수로 열거 형을 사용하는 방법을 보여주었습니다.

또한 입력 문자열을 열거 형 상수에 매핑 할 수있는 사용자 지정 변환기 예제도 제공했습니다.

마지막으로 알려지지 않은 입력 문자열을 만났을 때 Spring이 던진 예외를 처리하는 방법을 논의했습니다.

항상 그렇듯이 예제의 소스 코드는 GitHub에서 사용할 수 있습니다 .