当自定义Provider类时,如日期转换的Provider,
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该类,如:
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注解,如:
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),如下:
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。
有人不推荐使用jax-rs的路径扫描功能,据其说容易出现bug,参考文章如下:
https://blogs.oracle.com/japod/entry/when_to_use_jax_rs