2015-11-17 27 views
6

Ho scritto un ParamConverterProvider e un ParamConverter per consentire a JAX-RS (Jersey) di istanziare un'enumerazione in HeaderParam. Il convertitore si presenta cosìIl metodo fromString di ParamConverter non viene chiamato su valori Null 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(); 
     } 
    } 
} 

Tuttavia il metodo fromstring non viene chiamato quando l'intestazione non viene inviato in quanto il codice di Jersey in classe SingleValueExtractor nel metodo org.glassfish.jersey.server.internal.inject.SingleValueExtractor.extract(MultivaluedMap<String, String>) c'è un codice sulla linea 82 che verifica se il valore del parametro è nullo oppure no e se è! = null viene chiamato il metodo fromString.

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

Quello che realmente voglio è di aggirare questa parte e lasciare che il mio fromstring ottenere chiamato anche su valori nulli a causa di qualche speciale movimentazione lì eccezione.

C'è un modo per quello. Non voglio utilizzare la convalida del bean come @NotNull in modo da gestire tutto in un unico posto.

risposta

7

Se è possibile modificare le versioni Jersey, lo farei. Sembra che questo comportamento si verifichi 2.13 e precedenti. 2.14 e successivamente questo problema viene risolto, dove 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); 
    } 
} 

Se prima, un null comporterebbe defaultValue() (che è solo un risultato null), ora tutti valori vengono passati al fromString, che finisce per chiamare yourfromString

+0

Grazie per la soluzione. Problema risolto. L'implementazione più recente di Jersey ha più senso. – LAC