Рубрики
Без рубрики

Использование Enums в качестве параметров запроса весной

Узнайте, как использовать enums в качестве параметров запроса в контроллерах Spring REST и как обрабатывать исключения, вызванные недействительными входами.

Автор оригинала: baeldung.

Использование Enums в качестве параметров запроса весной

1. Введение

В большинстве типичных веб-приложений нам часто приходится ограничивать параметр запроса набором предопределенных значений. Enums являются отличным способом сделать это.

В этом быстром учебнике мы покажем, как использовать enums в качестве параметров веб-запроса весной MVC.

2. Используйте Enums в качестве параметров запроса

Давайте сначала определим enum для наших примеров:

public enum Modes {
    ALPHA, BETA;
}

Затем мы можем использовать этот энум в качестве ЗапросПараметр в контроллере весны:

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

Или мы можем использовать его в качестве ПутьВариантный :

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

Когда мы делаем веб-запрос, например, /mode2str?mode-ALPHA параметр запроса является Струнные объект. Весна может попытаться преобразовать этот Струнные возражать против Энум объект, используя его StringToEnumConverterFactory класс.

Преобразование бэк-энда использует Enum.valueOf метод. Поэтому строка имени ввода должна точно соответствовать одному из заявленных значений enum .

Когда мы делаем веб-запрос со значением строки, которое не соответствует одному из наших значений enum например, /mode2str?mode-неизвестный, Пружина не сможет преобразовать его в указанный тип enum. В этом случае Мы получим ПреобразованиеFailedException .

3. Пользовательский преобразователь

В Java считается хорошей практикой определение значений enum с буквами верхнего регистра, так как они являются константами. Тем не менее, мы можем захотеть поддержать письма нижнего регистра в URL-адресе запроса.

В этом случае нам необходимо создать пользовательский преобразователь:

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

Чтобы использовать наш пользовательский преобразователь, мы должны зарегистрировать его в весенней конфигурации :

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

4. Обработка исключений

Enum.valueOf метод в StringToEnumConverter бросит НезаконныеАргументЭксцепция если наши Режимы enum не имеет соответствует постоянной. Мы можем обрабатывать это исключение в нашем пользовательском преобразователь по-разному, в зависимости от требований.

Например, мы можем просто получить возврат преобразователь нулевой за несоблюдение Струнные секунда:

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

Однако, если мы не обрабатываем исключение локально в пользовательском преобразователь, Весна будет бросать ПреобразованиеFailedException исключение из метода контроллера вызова. Есть несколько способов обработки этого исключения .

Например, мы можем использовать глобальный класс обработчика исключений:

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

5. Заключение

В этой статье мы показали, как использовать enums в качестве параметров запроса весной с некоторыми примерами кода.

Мы также предоставили пользовательский пример преобразователь, который может сопоставить строку ввода с постоянной enum.

Наконец, мы обсудили, как справиться с исключением, брошенным Spring, когда он сталкивается с неизвестной строкой ввода.

Как всегда, исходный код для учебника доступен более на GitHub .