Tengo un controlador de arranque de primavera, uno de mis parámetros es un Enum. La enumeración tiene un valor de cadena. Quiero pasar como parámetro el valor del enum y que el controlador me dé el Enum. Se puede hacer esto?
@RequestMapping(value = "/") public MyResponse getResponse ( @RequestParam(value = "version") final ProjectVersion version ) { ...bla bla bla... } public enum ProjectVersion { VERSION_1 ("1.00") VERSION_2 ("2.00") private final String version; ProjectVersion ( String version ) { this.version = version; } @Override public String toString() { return this.version; } }Quiero poder hacer una solicitud de la siguiente manera:
http://mihost.com/miruta?version=1.00
Y obtener en el controlador ProjectVersion.VERSION_1
¿Algunas ideas?
Esto no es posible como es. Debe crear su convertidor personalizado para convertir de String a ProjectVersion .
Por ejemplo, primero define el convertidor de String a ProjectVersion :
public class ProjectVersionConverter implements ConditionalGenericConverter { @Override public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { return targetType.getType().equals(ProjectVersion.class); } @Override public Set<ConvertiblePair> getConvertibleTypes() { return Collections.singleton(new ConvertiblePair(String.class , ProjectVersion.class)); } @Override public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { return ProjectVersion.findByVersion((String)source); } }Entonces regístralo:
@Configuration public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new ProjectVersionConverter()); } } Puede omitir el registro si define ProjectVersionConverter como un bean Spring. (Este código no ha sido probado).
Debido a que necesita pasar (para cada solicitud) el argumento al método Controller , la solución limpia sería usar HandlerMethodArgumentResolver , de modo que el contenedor Spring pueda inyectar dinámicamente su argumento ProjectVersion al método Controller como se muestra a continuación:
Clase ProjectVersionArgumentResolver :
public class ProjectVersionArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter methodParameter) { return methodParameter.getParameterType().equals(ProjectVersion.class); } @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { return ProjectVersion.fromString(nativeWebRequest.getParameter("version")); } }Clase Spring-boot ApplicationLauncher:
public class MyProjectApplicationLauncher extends WebMvcConfigurerAdapter { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { //add the new resolver argumentResolvers.add(new MyMethodArgumentResolver()); } public static void main(String[] args) { SpringApplication.run(MyProjectApplicationLauncher.class, args); } } Clase ProjectVersion :
public enum ProjectVersion { //add your existing code //Add fromString method to convert string to enum public static ProjectVersion fromString(String input) { for (ProjectVersion projectVersion : ProjectVersion.values()) { if (projectVersion.version.equals(input)) { return projectVersion; } } return null; } }