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.
Grazie per la soluzione. Problema risolto. L'implementazione più recente di Jersey ha più senso. – LAC