2017-04-06 12 views
5

के रूप में एनम पैरामीटर मेरे पास एक वसंत बूट नियंत्रक है, मेरे पैरामीटर में से एक एनम है। 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

हाँ, कस्टम serializer साथ। इसे देखें, बिल्कुल आपका मामला: 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); 
    } 
} 

तो यह रजिस्टर:

@Configuration 
public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter { 

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

आप पंजीकरण को छोड़ सकते हैं अगर आप ProjectVersionConverter परिभाषित एक वसंत सेम है

उदाहरण के लिए पहली बार एक StringProjectVersion करने से कनवर्टर परिभाषित करता है। (इस कोड का परीक्षण नहीं किया गया है)।

+0

तर्क समाधानकर्ता का उपयोग क्लीनर और बेहतर दृष्टिकोण है। – digz6666

+0

मैं सहमत नहीं हूं। एक कनवर्टर को परेशान नहीं होना चाहिए कि मान एक अनुरोध पैरा या पथ चर के रूप में पारित किया जाता है। जब तक एक अज्ञात कनवर्टर के साथ, सही एनोटेशन का उपयोग किया जाता है, इसे काम करना चाहिए। –

1

क्योंकि आप (प्रत्येक अनुरोध के लिए) पारित करने के लिए Controller विधि करने के लिए तर्क की जरूरत है, स्वच्छ समाधान के रूप में नीचे दिखाया गया है, HandlerMethodArgumentResolver उपयोग करने के लिए इतना है कि स्प्रिंग कंटेनर गतिशील नियंत्रक विधि करने के लिए अपने ProjectVersion तर्क इंजेक्षन कर सकते हैं हो सकता है :

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

हार्डकोडेड स्ट्रिंग "संस्करण" के बजाय बेहतर उपयोग विधि पैरामीटर .getParameterName()। तो ProjectVersion.fromString (nativeWebRequest.get पैरामीटर (विधि पैरामीटर .get पैरामीटर नाम()); – digz6666