2015-11-17 9 views
6

में शून्य मानों पर नहीं कहा जाता है। मैंने जेएक्स-आरएस (जर्सी) को हेडरपेराम में एक enum को तत्काल करने के लिए पैराम कनवर्टरप्रोवाइडर और पैराम कनवर्टर लिखा है। कनवर्टर की तरह दिखता है इसपैराम कनवर्टर की स्ट्रिंग विधि को जेएक्स-आरएस

@Provider 
public class MyEnumParamConverterProvider implements ParamConverterProvider { 


    public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) { 
     if (rawType.equals(MyEnum.class)) { 
      return (ParamConverter<T>) new MyEnumParamConverter(); 
     } 
     return null; 
    } 

    private static class MyEnumParamConverter implements ParamConverter<MyEnum> { 

     @Override 
     public MyEnum fromString(String enum) { 
      return MyEnum.of(enum); 
     } 

     @Override 
     public String toString(MyEnum enum) { 
      return enum.toString(); 
     } 
    } 
} 

लेकिन जब हैडर नहीं क्योंकि जर्सी कोड पर वर्ग SingleValueExtractor में विधि में भेजा जाता है fromString विधि नहीं बुलाया जाता है org.glassfish.jersey.server.internal.inject.SingleValueExtractor.extract(MultivaluedMap<String, String>) वहाँ जो जांच करता है कि पैरामीटर मान रिक्त है लाइन 82 पर एक कोड है या नहीं और यदि यह है! = शून्य तो से स्ट्रिंग विधि कहा जाता है।

public T extract(MultivaluedMap<String, String> parameters) { 
     String v = parameters.getFirst(getName()); 
     if (v != null) { 
      try { 
       return fromString(v); 
      } catch (WebApplicationException ex) { 
       throw ex; 
      } catch (ProcessingException ex) { 
       throw ex; 
      } catch (Exception ex) { 
       throw new ExtractorException(ex); 
      } 
     } else { 
      return defaultValue(); 
     }  
} 

मैं वास्तव में क्या चाहते हैं इस हिस्से को दरकिनार और मेरे fromString भी कुछ विशेष अपवाद वहाँ से निपटने की वजह से शून्य मान पर बुलाया करते है।

क्या इसका कोई तरीका है। मैं @NotNull जैसे बीन सत्यापन का उपयोग नहीं करना चाहता हूं ताकि मैं सब कुछ एक ही स्थान पर संभाल सकूं।

उत्तर

7

यदि आप जर्सी संस्करणों को बदल सकते हैं, तो मैं ऐसा करूँगा। ऐसा लगता है कि यह व्यवहार 2.13 और इससे पहले होता है। 2.14 और बाद में इस समस्या का समाधान होने, जहां the implementation has changed

@Override 
public T extract(MultivaluedMap<String, String> parameters) { 
    String v = parameters.getFirst(getName()); 
    try { 
     return fromString((v == null && isDefaultValueRegistered()) 
            ? getDefaultValueString() : v); 
    } catch (WebApplicationException ex) { 
     throw ex; 
    } catch (ProcessingException ex) { 
     throw ex; 
    } catch (IllegalArgumentException ex) { 
     return defaultValue(); 
    } catch (Exception ex) { 
     throw new ExtractorException(ex); 
    } 
} 

कहाँ से पहले, एक अशक्त defaultValue() तक ले जाएगा (जो सिर्फ एक null परिणाम है), अब सभी मूल्यों fromString के लिए पारित करने के लिए, जो बुला समाप्त होता है आपकेfromString

+0

समाधान के लिए धन्यवाद। समस्या का हल किया। न्यू जर्सी कार्यान्वयन अधिक समझ में आता है। – LAC

संबंधित मुद्दे