2015-11-17 20 views
6

Ich habe einen ParamConverterProvider und einen ParamConverter geschrieben, damit JAX-RS (Jersey) eine Enumeration in HeaderParam instanziiert. Der Konverter sieht wie folgt ausfromString-Methode von ParamConverter wird nicht aufgerufen Nullwerte in JAX-RS

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

jedoch die vonString Methode wird nicht aufgerufen, wenn der Kopf nicht, weil auf Jersey Code gesendet wird, in der Klasse SingleValueExtractor in Verfahren org.glassfish.jersey.server.internal.inject.SingleValueExtractor.extract(MultivaluedMap<String, String>) gibt es einen Code auf der Leitung 82, das überprüft, ob der Parameterwert null ist oder nicht und wenn es! = null ist, wird die fromString-Methode aufgerufen.

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

Was ich eigentlich möchte diesen Teil umgehen und ließ meine vonString dort Handhabung, weil einige spezielle Ausnahme auch auf NULL-Werte aufgerufen.

Gibt es einen Weg dazu. Ich möchte keine Bean-Validierung wie @NotNull verwenden, damit ich alles an einem Ort behandle.

Antwort

7

Wenn Sie Jersey-Versionen ändern können, würde ich dies tun. Es scheint, dass dieses Verhalten 2.13 und früher auftritt. 2,14 und später dieses Problem behoben ist, wo 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); 
    } 
} 

Wo vor, eine Null zu defaultValue() führen würde (was nur ein null Ergebnis ist), jetzt alle Werte übergeben bekommen an die fromString, der Aufruf endet IhrefromString

+0

Danke für die Lösung. Problem gelöst. Die neuere Jersey-Implementierung macht mehr Sinn. – LAC