我为更复杂的问题编写了我的解决方案:map GET params throw MultivaluedMap to Object。可能对其他人有帮助。
GET 查询是与您的服务器聊天的非常简单的方法。即使是具有浏览器 url 控制的非程序员也可以执行简单的 API 任务。
但是不推荐从“get”查询创建对象的方式(原因之一是最大限制为 4000 个符号)。
GET 查询默认具有 MediaType.APPLICATION_OCTET_STREAM。
// GOAL: create simple in use API (for non-programmers) to call rest service to test functional. User can use any business object field.
// So need map GET query params to server business object.
// Create Provider and save it in jersey rest folder (for auto detect).
//
// PROBLEM: "get" query hasn't body and query params don't available get from readFrom prodiver method
// So use uriInfo for getting query params
@Provider
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public class GETQueryMapperProvider<T> implements MessageBodyReader<T> {
//[!!!] MAIN PART: save the uri
@Context
private UriInfo uriInfo;
@Override
public boolean isReadable(Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
return true;
}
@Override
public T readFrom(Class<T> tClass, Type type, Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> stringStringMultivaluedMap,
InputStream inputStream) throws IOException, WebApplicationException {
MultivaluedMap queryParams = uriInfo.getQueryParameters();
//create from Map Object
return ServiceUtils.convertMapToObject(queryParams, tClass);
}
}
第二部分解决方案:
public static <T> T convertMapToObject(Map map, Class<T> objectClass) {
try {
//[!!!] MAIN PART - MultivaluedMap for each value create list.
//But we list only for fields with collection type, for other need take first value.
map = fixCollectionsValue(map, objectClass);
ObjectMapper ob = new ObjectMapper();
StringWriter json = new StringWriter();
ob.writeValue(json, map);
return ob.readValue(json.toString(), objectClass);
} catch (IOException e) {
log.error(e.getMessage(), e);
}
return null;
}
protected static Map fixCollectionsValue(Map map, Class objectClass) {
Map newMap = new HashMap(map);
for(Field field : objectClass.getDeclaredFields()) {
if(!Modifier.isStatic(field.getModifiers())
&&!Modifier.isFinal(field.getModifiers())) {
String name = field.getName();
Object value = map.get(name);
Object newValue = value;
if(value != null) {
if(isCollectionClass(field.getType())) {
if(!isCollectionClass(value.getClass())) {
newValue = new ArrayList();
((ArrayList) newValue).add(value);
newMap.put(name, newValue);
}
} else {
if(isCollectionClass(value.getClass())) {
//take first value to our object
newValue = ((Collection) newValue).iterator().next();
newMap.put(name, newValue);
}
}
}
}
}
return newMap;
}
protected static boolean isCollectionClass(Class clazz) {
return clazz.isArray() ||
Collection.class.isAssignableFrom(clazz);
}