Spring Boot Controller - 枚举参数为Value

Pan*_*nos 7 enums spring jackson spring-boot

我有一个弹簧启动控制器,我的一个参数是一个枚举.枚举有一个字符串值.我想将enum和控制器的值作为参数传递给我Enum.可以这样做吗?

 @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;
     }

}
Run Code Online (Sandbox Code Playgroud)

我希望能够提出如下要求:

http://myhost.com/mypath?version=1.00

并在控制器中获取ProjectVersion.VERSION_1

有任何想法吗?

Nic*_*rot 10

这是不可能的.您必须创建自定义转换器以从a转换StringProjectVersion.

例如,首先定义转换器从a StringProjectVersion:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后注册:

@Configuration
public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {

  @Override
  public void addFormatters(FormatterRegistry registry) {
    registry.addConverter(new ProjectVersionConverter());
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您定义ProjectVersionConverter了Spring bean,则可以跳过注册.(此代码未经过测试).