Usando enums como parâmetros de solicitação no Spring

Usando enums como parâmetros de solicitação no Spring

1. Introdução

Na maioria dos aplicativos Web típicos, geralmente precisamos restringir um parâmetro de solicitação a um conjunto de valores predefinidos. Enums são uma ótima maneira de fazer isso.

Neste tutorial rápido, mostraremos como usar enums como parâmetros de solicitação da web no Spring MVC.

2. Usar enums como parâmetros de solicitação

Vamos primeiro definir um enum para nossos exemplos:

public enum Modes {
    ALPHA, BETA;
}

Podemos então usar este enum comoRequestParameter em um controlador Spring:

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

Ou podemos usá-lo comoPathVariable:

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

Quando fazemos uma solicitação da web, como/mode2str?mode=ALPHA, o parâmetro da solicitação é um objetoString. O Spring pode tentar converter este objetoString em um objetoEnum usando sua classeStringToEnumConverterFactory.

A conversão de back-end usa o métodoEnum.valueOf. Portanto,the input name string must exactly match one of the declared enum values.

When we make a web request with a string value that doesn’t match one of our enum values, por exemplo,/mode2str?mode=unknown, Spring não conseguirá convertê-lo para o tipo de enum especificado. Neste caso,we’ll get a ConversionFailedException.

3. Conversor personalizado

Em Java, é considerada uma boa prática definir valores enum com letras maiúsculas, pois eles são constantes. No entanto, podemos oferecer suporte a letras minúsculas no URL da solicitação.

Nesse caso, precisamos criar um conversor personalizado:

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

Para usar nosso conversor personalizado, precisamosregister it in the Spring configuration:

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

4. Manipulação de exceção

O métodoEnum.valueOf emStringToEnumConverter lançará umIllegalArgumentException se nosso enumModes não tiver uma constante correspondente. Podemos lidar com essa exceção em nosso conversor personalizado de diferentes maneiras, dependendo dos requisitos.

Por exemplo, podemos simplesmente fazer com que nosso conversor retornenull paraStrings não correspondente:

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

No entanto, se não tratarmos a exceção localmente no conversor personalizado, o Spring lançará uma exceçãoConversionFailedException para o método do controlador de chamada. Existemseveral ways to handle this exception.

Por exemplo, podemos usar uma classe de manipulador de exceção global:

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

5. Conclusão

Neste artigo, mostramos como usar enumerações como parâmetros de solicitação no Spring com alguns exemplos de código.

Também fornecemos um exemplo de conversor personalizado que pode mapear a sequência de entrada para uma constante enum.

Finalmente, discutimos como lidar com a exceção lançada pelo Spring quando ele encontra uma sequência de entrada desconhecida.

Como sempre, o código-fonte do tutorial está disponívelover on GitHub.