Использование 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 ResponseEntityhandleConflict(RuntimeException ex) { return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST); } }
5. Заключение
В этой статье мы показали, как использовать enums в качестве параметров запроса весной с некоторыми примерами кода.
Мы также предоставили пользовательский пример преобразователь, который может сопоставить строку ввода с постоянной enum.
Наконец, мы обсудили, как справиться с исключением, брошенным Spring, когда он сталкивается с неизвестной строкой ввода.
Как всегда, исходный код для учебника доступен более на GitHub .