当自定义Provider类时,如日期转换的Provider,java
package soc.config; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import javax.ws.rs.WebApplicationException; import javax.ws.rs.ext.ParamConverter; import javax.ws.rs.ext.ParamConverterProvider; import javax.ws.rs.ext.Provider; public class DateConverterProvider implements ParamConverterProvider{ public class DateParameterConverter implements ParamConverter<Date> { public static final String format = "yyyy-MM-dd"; // set the format to whatever you need @Override public Date fromString(String string) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); try { return simpleDateFormat.parse(string); } catch (ParseException ex) { throw new WebApplicationException(ex); } } @Override public String toString(Date t) { return new SimpleDateFormat(format).format(t); } } @Override public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) { if (Date.class.equals(rawType)) { return (ParamConverter<T>) new DateParameterConverter(); } return null; } }
除了在本身的配置类里register该类,如:spring
package soc.config; //import org.codehaus.jackson.jaxrs.JacksonJsonProvider; import org.glassfish.jersey.filter.LoggingFilter; //import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.spring.scope.RequestContextFilter; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; public class ApplicationApi extends ResourceConfig { public ApplicationApi() { // 注册数据转换器 register(JacksonJsonProvider.class); // 注册日志 register(LoggingFilter.class); // register application resources register(UserResource.class); // register filters register(RequestContextFilter.class); // register mine exception class ,to find the trace of exception register(DebugMapperException.class); // register my DateConverterProvider register(DateConverterProvider.class); } }
也能够在DateConverterProvider的类声明上部加@Provider注解,如:json
package soc.config; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import javax.ws.rs.WebApplicationException; import javax.ws.rs.ext.ParamConverter; import javax.ws.rs.ext.ParamConverterProvider; import javax.ws.rs.ext.Provider; @Provider public class DateConverterProvider implements ParamConverterProvider{ public class DateParameterConverter implements ParamConverter<Date> { public static final String format = "yyyy-MM-dd"; // set the format to whatever you need @Override public Date fromString(String string) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); try { return simpleDateFormat.parse(string); } catch (ParseException ex) { throw new WebApplicationException(ex); } } @Override public String toString(Date t) { return new SimpleDateFormat(format).format(t); } } @Override public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) { if (Date.class.equals(rawType)) { return (ParamConverter<T>) new DateParameterConverter(); } return null; } }
这样有多个相似的Provider类时,能够使用jax-rs的自动路径扫描,即指定全部的Provider类全部的包名(soc.config),以下:oracle
package soc.config; //import org.codehaus.jackson.jaxrs.JacksonJsonProvider; import org.glassfish.jersey.filter.LoggingFilter; //import org.glassfish.jersey.jackson.JacksonFeature; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.spring.scope.RequestContextFilter; import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; public class ApplicationApi extends ResourceConfig { public ApplicationApi() { // 注册数据转换器 register(JacksonJsonProvider.class); // 注册日志 register(LoggingFilter.class); // register filters register(RequestContextFilter.class); // register mine exception class ,to find the trace of exception register(DebugMapperException.class); // register my DateConverterProvider // register(DateConverterProvider.class); packages("soc.config,soc.resource");// 等价于packages(true, "soc.config"); } }
可是这里要注意的是,自定义的Provider类里必定要有合适的构造器,经过个人简单测试,是要有个无参构造才行,否则会报错:Could not find a suitable constructor in ……Provider class。app
有人不推荐使用jax-rs的路径扫描功能,据其说容易出现bug,参考文章以下:ide