2017-04-06 20 views
5

Tôi có bộ điều khiển khởi động lò xo, một trong các tham số của tôi là một Enum. Enum có giá trị chuỗi. Tôi muốn vượt qua như tham số giá trị của enum và bộ điều khiển để cho tôi Enum. Điều này có thể được thực hiện?Bộ điều khiển khởi động mùa xuân - Tham số enum dưới dạng Giá trị

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

} 

Tôi muốn có thể để thực hiện một yêu cầu như sau:

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

Và nhận được trong bộ điều khiển các ProjectVersion.VERSION_1

Bất kỳ ý tưởng?

+0

Vâng, với serializer tùy chỉnh. Xem trường hợp này, chính xác trường hợp của bạn: http://stackoverflow.com/questions/7766791/serializing-enums-with-jackson –

+1

Nếu bạn vượt qua 'VERSION_1', nó sẽ hoạt động, nếu bạn vượt qua giá trị nội bộ, bạn sẽ không cần tự tạo trình chuyển đổi tùy chỉnh. –

Trả lời

5

Điều này không thể thực hiện được. Bạn phải tạo công cụ chuyển đổi tùy chỉnh của mình để chuyển đổi từ một số String thành ProjectVersion.

Ví dụ đầu tiên xác định chuyển đổi từ một 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); 
    } 
} 

Sau đó đăng ký nó:

@Configuration 
public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter { 

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

Bạn có thể bỏ qua việc đăng ký nếu bạn xác định ProjectVersionConverter có đậu mùa xuân. (Mã này chưa được kiểm tra).

+0

Sử dụng trình phân tích đối số là cách tiếp cận rõ ràng và tốt hơn. – digz6666

+0

Tôi không đồng ý. Trình biến đổi không nên bận tâm rằng giá trị được chuyển qua dưới dạng tham số yêu cầu hoặc dưới dạng biến đường dẫn. Miễn là chú thích phù hợp được sử dụng, với bộ chuyển đổi thuyết phục, nó sẽ hoạt động. –

1

Bởi vì bạn cần phải vượt qua (đối với mỗi yêu cầu) đối số cho phương thức Controller, các giải pháp làm sạch sẽ được sử dụng HandlerMethodArgumentResolver, do đó mùa xuân chứa động có thể tiêm luận ProjectVersion của bạn với phương pháp điều khiển như hình dưới đây :

ProjectVersionArgumentResolver lớp:

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

mùa xuân-boot ApplicationLauncher lớp:

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 lớp:

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

Phương thức sử dụng tốt hơnParameter.getParameterName() thay cho chuỗi cứng "phiên bản". Vì vậy, ProjectVersion.fromString (nativeWebRequest.getParameter (phương thứcParameter.getParameterName())); – digz6666

Các vấn đề liên quan