使用httpclient向后端API POST数据的时候, 需要构建POST的param, 如果使用代码写的话太不优雅了, 所以考虑一种比较通用的方式实现, 详见代码, 我们使用的注解是 fastjson的, 大家可以使用其他的替换, 意思都是相通的
package zhwb.service.util;
import com.alibaba.fastjson.annotation.JSONField;
import org.apache.http.message.BasicNameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Date: 13-12-6
* Time: 上午11:57
*
* @author jack.zhang
*/
public abstract class HttpFastJsonUtils {
private static final Logger LOG = LoggerFactory.getLogger(HttpFastJsonUtils.class);
public static final List<BasicNameValuePair> convertBeanToBasicParam(Object jsonAnnotationBean) {
if (jsonAnnotationBean == null) {
throw new IllegalArgumentException("bean can not be null");
}
List<BasicNameValuePair> result = new ArrayList<BasicNameValuePair>();
Field[] fields = jsonAnnotationBean.getClass().getDeclaredFields();
for (Field field : fields) {
if (!field.isAnnotationPresent(JSONField.class)) { //field上是否有JsonField注解
throw new IllegalArgumentException("annotation can only be JSONFiled type");
}
JSONField jsonField = field.getAnnotation(JSONField.class); //拿到field上的JsonField注解对象
field.setAccessible(true);
String fieldString;
Object fieldValue = null;
try {
fieldValue = field.get(jsonAnnotationBean); //反射得到field的值, 注意private需要setAccessible
} catch (IllegalAccessException e) {
LOG.error("IllegalAccessException occur {}", e.getMessage());
}
if (fieldValue != null) {
if (field.getType().equals(Date.class)) { //对一些特殊类型做处理
fieldString = DateUtil.formatDateToString((Date) fieldValue, "yyyy-MM-dd");
} else {
fieldString = String.valueOf(fieldValue);
}
BasicNameValuePair basicNameValuePair = new BasicNameValuePair(jsonField.name(), fieldString);//构建httpclient需要的list
result.add(basicNameValuePair);
}
}
return result;
}
}