所以我想在JAX-RS創建自定義ParamConverter<Integer>
:如何創建一個處理原始int的ParamConverter <Integer>?
public class IntParamConverter implements ParamConverter<Integer>{
@Override
public Integer fromString(String value) {
try{
return Integer.valueOf(value);
}catch (Exception e){
//do some stuff
throw new BadRequestEx("Convert Exception");
}
}
@Override
public String toString(Integer value) {
return String.valueOf(value);
}
}
然後,我通過ParamConverterProvider註冊它:
@Provider
public class CustomParamConverterHandler implements ParamConverterProvider {
@Override
public <T> ParamConverter<T> getConverter(final Class<T> rawType, Type genericType, Annotation[] annotations) {
if (rawType.equals(Integer.class)){
return (ParamConverter<T>) new IntParamConverter();
}
return null;
}
}
,然後在資源POJO使用它,如下所示:
@GET
@Path("/conv")
@Produces({MediaType.TEXT_PLAIN})
public String conv(@QueryParam("no") int no) {
return ""+no;
}
在運行時(使用system.out測試),我發現Tomee(Apache cfx?)不使用我的IntParamConverter
。相反,如果我宣佈@QueryParam("no") Integer no
而不是@QueryParam("no") int no
然後一切工作正常(tomee使用我的自定義paramConverter
我試着註冊我IntParamConverter
與原始INT:
if (rawType.equals(int.class)){
return (ParamConverter<T>) new IntParamConverter();
}
但隨後運行時異常occures:
java.lang.ClassCastException: Cannot cast java.lang.Integer to int
at java.lang.Class.cast(Class.java:3369)
at org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(InjectionUtils.java:388)
at org.apache.cxf.jaxrs.utils.InjectionUtils.createParameterObject(InjectionUtils.java:978)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.readQueryString(JAXRSUtils.java:1210)
我該如何創建這樣一個處理原始int的ParamConverter?
我明白了,但Apache CFX或其他實現如何做到這一點?如果我沒有註冊我的自定義IntParamConverter,Tomee完成提供int值的工作。這只是對無效int輸入tomee返回錯誤404,我想避免這一點... – kosta