1. 소개
대부분의 일반적인 웹 애플리케이션에서는 요청 매개변수를 미리 정의된 값 세트로 제한해야 하는 경우가 많습니다. Enum은 이를 수행하는 좋은 방법입니다.
이 빠른 사용방법(예제)에서는 Spring MVC에서 웹 요청 매개 변수로 enum을 사용하는 방법을 보여줍니다.
2. Enum을 요청 매개변수로 사용
먼저 예제에 대한 Enum을 정의해 보겠습니다.
public enum Modes {
ALPHA, BETA;
}
그런 다음 이 Enum을 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 메서드를 사용합니다. 따라서 입력 이름 문자열은 선언된 Enum 값 중 하나와 정확히 일치해야 합니다 .
/mode2str?mode=unknown 과 같이 enum 값 중 하나와 일치하지 않는 문자열 값으로 웹 요청을 만들면 Spring은 지정된 enum 유형으로 변환하지 못합니다. 이 경우 ConversionFailedException 이 발생합니다 .
3. 커스텀 컨버터
Java에서는 Enum 값을 상수이므로 대문자로 정의하는 것이 좋습니다. 그러나 요청 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. 예외 처리
StringToEnumConverter 의 Enum.valueOf 메서드는 모드 열거 형 에 일치하는 상수가 없는 경우 IllegalArgumentException을 발생시킵니다 . 요구 사항에 따라 다양한 방식으로 사용자 지정 변환기에서 이 예외를 처리할 수 있습니다.
예를 들어, 변환기가 일치하지 않는 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 예외를 발생시킵니다. 이 예외를 처리하는 방법에는 여러 가지가 있습니다 .
예를 들어 전역 예외 처리기 클래스를 사용할 수 있습니다.
@ControllerAdvice
public class GlobalControllerExceptionHandler {
@ExceptionHandler(ConversionFailedException.class)
public ResponseEntity<String> handleConflict(RuntimeException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}
5. 결론
이 짧은 기사에서 우리는 몇 가지 코드 예제와 함께 Spring에서 요청 매개변수로 Enum을 사용하는 방법을 배웠습니다.
또한 입력 문자열을 Enum 상수에 매핑할 수 있는 사용자 지정 변환기 예제를 제공했습니다.
마지막으로 알 수 없는 입력 문자열을 만났을 때 Spring이 던진 예외를 처리하는 방법에 대해 논의했습니다.
항상 그렇듯이 이 기사의 소스 코드는 GitHub에서 사용할 수 있습니다 .