一、get請求時,用對象接受基本類型的參數
基本思路:
定義一個基本類作爲標識,讓所有的參數對象來繼承這個基本類;
jersey可以在服務請求後,resource方法調用之前進入到攔截代碼塊;
在攔截代碼塊中可以判斷resource方法的參數對象是否繼承了標識類;
如果是,則利用反射將get提交的參數值set進參數對象;
1、 定義標識類
public class Pagination extends BaseObject{
protected Integer pageSize=20;
protected Integer pageNo=-1; // -1 means don't paging
@JsonIgnore
protected Integer beginNo = 0;
protected Integer total = 0; }
2、關鍵的一步,需要提供一個provider類繼承com.sun.jersey.spi.inject.InjectableProvider
@Provider
public class PaginationProvider implements InjectableProvider<QueryParam,Parameter> {
@Context
private HttpContext hc;
@Context
protected HttpServletRequest request;
public PaginationProvider(@Context HttpContext hc, @Context HttpServletRequest request) {
this.hc = hc;
this.request = request;
}
@Override
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
@Override
public Injectable getInjectable(ComponentContext ic, QueryParam a,
Parameter c) {
final Class clazz = c.getParameterClass(); // 獲取參數對象
if (!Pagination.class.isAssignableFrom(clazz)) { // 判斷是否繼承標識類
return null;
}
return new Injectable<Object>() {
public Object getValue() {
Object parameterBean=null;
try {
parameterBean = clazz.newInstance();
MultivaluedMap<String, String> params = hc.getUriInfo().getQueryParameters();//獲取get提交的參數值
Class clz = clazz;
for (;!clz.equals(Object.class);clz=clz.getSuperclass()) {
Field[] fields = clz.getDeclaredFields();
for (Field field:fields) {
Object value = params.get(field.getName());
if (value == null) {
continue;
}
try {
BeanUtils.setProperty(parameterBean, field.getName(), value); //屬性拷貝
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
//對象參數已經注入了所提交的參數值
// 設置上下文 //這裏還可以做其他工作
if (ContextPagination.class.isAssignableFrom(clazz)) {
User user = (User)request.getAttribute(CacheBase.USERINFO);
ContextPagination context = (ContextPagination)parameterBean;
context.setCurrUserId(user.getUserId());
context.setCurrFeedId(user.getFeedId());
context.setNetworkId(user.getNetworkId());
context.setOrgId(user.getOrgId());
context.setCurrUserName(user.getUsername());
}
} catch (InstantiationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
return parameterBean;
}
};
}
}
二、url訪問服務之前可以將參數進行攔截,比如對參數進行權限檢查,
但post參數只能使用一次,當權限檢查使用之後,
resource服務裏面就不能獲取該參數;
基本思路:將參數取出之後,在設置一遍,聽起來很簡答,但jersey將設置的方法隱藏的很深,找了好久才找到了
private List getValFromRequest(ContainerRequest request , String[] targets) throws JSONException{
List values = new ArrayList();
String var = null;
if(targets != null && targets.length > 0){
String method = request.getMethod();
if (method.equals("GET")) {
MultivaluedMap map = request.getQueryParameters();
for (int i=0;i
List list = (List)map.get(targets[i]);
var = list.get(0);
values.add(var);
}
}
if (method.equals("POST")) {
MediaType tmp = request.getMediaType();
MediaType media = new MediaType(tmp.getType(), tmp.getSubtype());
if (media.equals(MediaType.APPLICATION_JSON_TYPE)) {
Object object = request.getEntity(Object.class);
for (int i=0;i
try {
var = BeanUtils.getProperty(object,
targets[i]);
} catch (IllegalAccessException
e) {
logger.error(e.getMessage(),e.getCause());
} catch (InvocationTargetException
e) {
logger.error(e.getMessage(),e.getCause());
} catch (NoSuchMethodException
e) {
logger.error(e.getMessage(),e.getCause());
}
values.add(var);
}
request.setEntity(Object.class, Object.class,
null, null, null, object);
}
}
}
return values;
}