在JAX-RS中,没有在Null值上调用ParamConverter的fromString方法

时间:2015-11-17 23:26:21

标签: rest jax-rs converter jersey-2.0 param

我写了一个ParamConverterProvider和一个ParamConverter,以便让JAX-RS(Jersey)在HeaderParam中实例化一个枚举。转换器看起来像这样

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

然而,当未发送Header时未调用fromString方法,因为在方法org.glassfish.jersey.server.internal.inject.SingleValueExtractor.extract(MultivaluedMap<String, String>)的类SingleValueExtractor中的Jersey代码上,第82行上有一个代码,用于检查参数值是否为null以及是否为null is!= null然后调用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();
        }     
}

我真正想要的是绕过这部分并让我的fromString甚至在空值上被调用,因为那里有一些特殊的异常处理。

有没有办法解决这个问题。我不想像@NotNull那样使用bean验证,以便我在一个地方处理所有事情。

1 个答案:

答案 0 :(得分: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);
    }
}

如果先前,null将导致defaultValue()(这只是null结果),现在所有值都会传递给fromString,最后致电您的 fromString