2017-04-06 1 views
5

스프링 부트 컨트롤러가 있습니다. 내 매개 변수 중 하나가 열거 형입니다. 열거 형은 문자열 값을가집니다. Enum과 컨트롤러의 값을 매개 변수로 전달하여 Enum을 제공하고 싶습니다. 이 작업을 수행 할 수 있습니까? 컨트롤러에서 얻을스프링 부트 컨트롤러 - 값으로 열거 형 매개 변수

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

을 그리고 ProjectVersion.VERSION_1

어떤 아이디어가 :

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

} 

나는 다음과 같이 요청을 할 수있게하려면?

+0

예. 이것, 정확히 당신의 경우 참조하십시오 : http://stackoverflow.com/questions/7766791/serializing-enums-with-jackson –

+1

'VERSION_1'을 전달하면 작동 할 것입니다. 내부 값을 전달하면 그럴 것입니다. 직접 사용자 지정 변환기를 만들어야합니다. –

답변

5

이것은 현재대로 가능하지 않습니다. String에서 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); 
    } 
} 

그런 다음에 등록 : 당신이 ProjectVersionConverter를 정의하는 경우는 등록을 건너 뛸 수 있습니다

@Configuration 
public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter { 

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

Spring 빈을 가지고 예를 들어

먼저 StringProjectVersion에가에서 컨버터를 정의합니다. 이 코드는 테스트되지 않았습니다. 당신은 (각 요청의 경우) Controller 방법에 대한 인수를 전달해야하기 때문에 다음과 같이

+0

인수 리졸버를 사용하는 것이 더 깔끔하고 나은 접근 방법입니다. – digz6666

+0

동의하지 않습니다. 변환기는 값이 요청 매개 변수 또는 경로 변수로 전달되는 것을 방해해서는 안됩니다. 불가분의 변환기를 사용하여 올바른 주석을 사용하는 한 제대로 작동해야합니다. –

1

, 깨끗한 솔루션은 Spring 컨테이너가 동적으로 컨트롤러 방법로 ProjectVersion 인수를 주입 할 수 있도록, HandlerMethodArgumentResolver을 사용하는 것입니다 :

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

봄 부팅 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); 
    } 
} 

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

하드 코딩 된 문자열 "version"대신 method.Parameter.getParameterName()을 사용하는 것이 더 좋습니다. 따라서 ProjectVersion.fromString (nativeWebRequest.getParameter (methodParameter.getParameterName())); – digz6666