2017-04-06 26 views
5

Yaylı önyükleme denetleyicim var, parametrelerimden biri Enum. Enum bir dize değerine sahiptir. Enum değerini vermek için enum ve kontrolörün değerini parametre olarak geçmek istiyorum. Bu yapılabilir mi? denetleyici olsunSpring Boot Controller - Enum parametresi Değer

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

Ve ProjectVersion.VERSION_1

Herhangi bir fikir:

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

} 

ben şöyle bir istek yapmak isterler?

+0

Evet. Buna bakın, tam olarak sizin durumunuz: http://stackoverflow.com/questions/7766791/serializing-enums-with-jackson –

+1

Eğer 'VERSION_1' değerini geçerseniz, işe yarayacak, eğer iç değeri geçerseniz o zaman kendiniz bir özel dönüştürücü oluşturmanız gerekir. –

cevap

5

Bu mümkün değildir. String'dan ProjectVersion'a dönüştürmek için özel dönüştürücünüzü oluşturmanız gerekir.

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

Sonra kaydetmek: Eğer ProjectVersionConverter tanımlamak eğer kayıt atlayabilirsiniz

@Configuration 
public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter { 

    @Override 
    public void addFormatters(FormatterRegistry registry) { 
    registry.addConverter(new ProjectVersionConverter()); 
    } 
} 

Bahar fasulye sahiptir Örneğin

ilk StringProjectVersion bir gelen dönüştürücü tanımlar. (Bu kod test edilmemiştir). (her istek için) Controller yöntemine argüman iletilmesi gerektiğinden aşağıda gösterildiği gibi

+0

Argüman çözümleyiciyi kullanmak daha temiz ve daha iyi bir yaklaşımdır. – digz6666

+0

Katılıyorum. Bir dönüştürücü, değerin bir istek parametresi olarak veya bir yol değişkeni olarak geçirilmesinden rahatsız olmamalıdır. Doğru ek açıklama kullanıldığı sürece, bir agnostik dönüştürücü ile çalışmalıdır. –

1

temiz çözüm Bahar konteyner dinamik Kontrolör yöntemine için ProjectVersion argüman enjekte böylece HandlerMethodArgumentResolver kullanmak olacaktır :

ProjectVersionArgumentResolver sınıfı:

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")); 
    } 
} 

İlkbahar-önyükleme ApplicationLauncher sınıfı:

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

ProjectVersion sınıfı: özel seri hale ile

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; 
    } 
} 
+0

Daha iyi bir yöntem "Parametre" kodlu kod yerine "ParametreParameter.getParameterName() yöntemini kullanın. Bu nedenle ProjectVersion.fromString (nativeWebRequest.getParameter (methodParameter.getParameterName())); – digz6666

İlgili konular