欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HTTP请求bean转换工具

程序员文章站 2022-07-11 14:19:55
...
Java泛型详解 :http://blog.csdn.net/jinuxwu/article/details/6771121
http://www.cnblogs.com/tech-bird/p/3516325.html
http://lichaozhangobj.iteye.com/blog/476911
<? extends SomeClass>与<T extends SomeClass>的区别 :http://blog.csdn.net/cgf1993/article/details/50754584
instanceof 与isAssignableFrom :http://blog.csdn.net/kjfcpua/article/details/7045207
Java String和Date的转换:http://www.cnblogs.com/bmbm/archive/2011/12/06/2342264.html
测试主类:
 package test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import util.JsonUtils;

/**
 * 根据请求转换请求参数bean
 * @author donald
 * @date 2017-1-6
 * @time 上午11:29:37
 */
public class RequestParamUtils {
	private static final Logger log = LoggerFactory.getLogger(RequestParamUtils.class);
	private static final String SET_METHOD_PREFIX = "set";
	private static final String GET_METHOD_PREFIX = "get";
	private static final String GETCLASS_METHOD_SUFFIX = "class";
	private static SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private static volatile RequestParamUtils instance = null;
    public static synchronized RequestParamUtils getInstance(){
    	if (instance == null){
    		instance = new RequestParamUtils();
    	}
    	return instance;
    }
    /**
     * 转化bean
     * @param request
     * @param clazz
     * @return
     */
   
      @SuppressWarnings({ "rawtypes", "unchecked" })
	public  <T> T getParamBean(HttpServletRequest request, Class<T> clazz) {
		T bean = null;
		try {
			bean = clazz.newInstance();
		} catch (InstantiationException e) {
			log.error("==========请求参数模型实例化错误");
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			log.error("==========无法访问参数模型构造函数");
			e.printStackTrace();
		}	
		Method[] allGetMethodList = clazz.getMethods();
		for(Method m : allGetMethodList){
			if(m.getName().startsWith(GET_METHOD_PREFIX)){
				if(isHaveGetProperties(clazz,m)){
					log.debug("========Get Method Name:"+m.getName());
					String setMethodName = SET_METHOD_PREFIX +  m.getName().substring(3,m.getName().length());
					log.debug("========set Method Name:"+setMethodName);
					Class type = getPropertiesType(clazz,m);
					if(type != null){
						try {
							Method setM = clazz.getMethod(setMethodName, type);
							String fieldName =  getMethodProperty(m);
							String mProperty = request.getParameter(fieldName);
							Object mobj = null;
							if(mProperty != null)
								mobj = ConvertStringToObject(mProperty,type);
							try {
								if(mobj != null)
									setM.invoke(bean, mobj);
							} catch (IllegalArgumentException e) {
								log.error("==========参数异常");
								e.printStackTrace();
							} catch (IllegalAccessException e) {
								log.error("==========非法访问");
								e.printStackTrace();
							} catch (InvocationTargetException e) {
								log.error("==========目标调用异常");
								e.printStackTrace();
							}
						} catch (SecurityException e) {
							log.error("==========无访问权限");
							e.printStackTrace();
						} catch (NoSuchMethodException e) {
							log.error("==========类中没有对应的方法:"+setMethodName);
							e.printStackTrace();
						}
					}
					
				}
				   
			}
		}
		return (T)bean;
	}
    /**
     * 从Map转换bean
     * @param params
     * @param clazz
     * @return
     */
	@SuppressWarnings("rawtypes")
	public  <T> T getParamBeanFromMap(Map<String,Object> params, Class<T> clazz) {
		T bean = null;
		try {
			bean = clazz.newInstance();
		} catch (InstantiationException e) {
			log.error("==========请求参数模型实例化错误");
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			log.error("==========无法访问参数模型构造函数");
			e.printStackTrace();
		}	
		Method[] allGetMethodList = clazz.getMethods();
		for(Method m : allGetMethodList){
			if(m.getName().startsWith(GET_METHOD_PREFIX)){
				if(isHaveGetProperties(clazz,m)){
					log.debug("========Get Method Name:"+m.getName());
					String setMethodName = SET_METHOD_PREFIX +  m.getName().substring(3,m.getName().length());
					log.debug("========set Method Name:"+setMethodName);
					Class type = getPropertiesType(clazz,m);
					if(type != null){
						try {
							Method setM = clazz.getMethod(setMethodName, type);
							String fieldName =  getMethodProperty(m);
							Object mProperty = params.get(fieldName);
							try {
								if(mProperty != null)
									setM.invoke(bean, mProperty);
							} catch (IllegalArgumentException e) {
								log.error("==========参数异常");
								e.printStackTrace();
							} catch (IllegalAccessException e) {
								log.error("==========非法访问");
								e.printStackTrace();
							} catch (InvocationTargetException e) {
								log.error("==========目标调用异常");
								e.printStackTrace();
							}
						} catch (SecurityException e) {
							log.error("==========无访问权限");
							e.printStackTrace();
						} catch (NoSuchMethodException e) {
							log.error("==========类中没有对应的方法:"+setMethodName);
							e.printStackTrace();
						}
					}
					
				}
				   
			}
		}
		return (T)bean;
	}
     
	/**
	 * clazz 是否存在m对应的属性
	 * @param clazz
	 * @param m
	 * @return
	 */
	private  boolean isHaveGetProperties(Class<?> clazz,Method m){
		boolean flag = false;
		String fieldName = getMethodProperty(m);
		log.debug("=========Get Method Field Name:"+fieldName);
	    try {
			if(!fieldName.equals(GETCLASS_METHOD_SUFFIX)&&!m.isAnnotationPresent(Transient.class)){
				if(clazz.getDeclaredField(fieldName)!= null) 
					flag = true;
			}
		} catch (SecurityException e) {
			log.error("==========无访问权限");
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			log.error("==========类中没有对应的方法属性:"+fieldName);
			e.printStackTrace();
		}
		return flag;
	}
    /**
     * 获取m方法对应属性的类型
     * @param clazz
     * @param m
     * @return
     */
	@SuppressWarnings("rawtypes")
	private  Class getPropertiesType(Class<?> clazz,Method m){
		Class type = null;
		String fieldName = getMethodProperty(m);
	    try {
			if(!fieldName.equals(GETCLASS_METHOD_SUFFIX)){
				Field f = clazz.getDeclaredField(fieldName);
				type = f.getType();
				log.debug(fieldName+" Type:"+type.toString());
			}
		} catch (SecurityException e) {
			log.error("==========无访问权限");
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			log.error("==========类中没有对应的方法属性:"+fieldName);
			e.printStackTrace();
		}
		return type;
	}
	/**
	 * 获取方法属性名
	 * @param m
	 * @return
	 */
    private  String getMethodProperty(Method m){
    	String fieldName = m.getName().substring(3,m.getName().length());
		fieldName = fieldName.substring(0, 1).toLowerCase()+fieldName.substring(1, fieldName.length());
		return fieldName;
    }
    /**
     * 
     * @param param
     * @param type
     * @return
     */
	@SuppressWarnings("unchecked")
	private <T> T ConvertStringToType (String param,Class<T> type){
    	T obj =null;
    		obj = (T) param;
    	return obj;
    }
	/**
	 * 转化类型
	 * @param param
	 * @param type
	 * @return
	 */
	@SuppressWarnings({ "deprecation"})
	private Object ConvertStringToObject(String param,Class<?> type){
		Object obj =null;
    	if(type.isAssignableFrom(String.class)){
    		obj = String.valueOf(param);
    	}
    	if(type.isAssignableFrom(Integer.class)){
    		obj = Integer.valueOf(param);
    	}
    	if(type.isAssignableFrom(Double.class)){
    		obj = Double.valueOf(param);
    	}
    	if(type.isAssignableFrom(Date.class)){
    		try {
				obj = time.parse(param);
			} catch (ParseException e) {
				log.error("=========时间日期解析异常");
				e.printStackTrace();
			}
    	}
    	return obj;
	}
    @SuppressWarnings({ "unchecked", "rawtypes" })
	public static void main(String[] args) {
    	//从map转换bean
    	Map params = new HashMap<String, Object>();
		params.put("userName", "donald");
		params.put("userAge", 20);
		params.put("borth", new Date());
		params.put("weight", 56.3);
		Param pm = new Param(); 
		pm = RequestParamUtils.getInstance().getParamBeanFromMap(params,Param.class);
		log.info("======result:"+JsonUtils.toJson(pm));
		
		//测试类型转换方法ConvertStringToType,这种强制转化的参数设置方式,容易出现参数异常
		String ss = "user";
		String it = "2";
		String du = "50.36";
		String date = "2016-10-23 12:05:56";
//		Object obj = RequestParamUtils.getInstance().ConvertStringToType(ss, String.class);
		/*log.info("String:"+RequestParamUtils.getInstance().ConvertStringToType(ss, String.class));
		log.info("it:"+RequestParamUtils.getInstance().ConvertStringToType(it, Integer.class));
		log.info("du:"+RequestParamUtils.getInstance().ConvertStringToType(du, Double.class));
		log.info("date:"+RequestParamUtils.getInstance().ConvertStringToType(date, java.util.Date.class));*/
		
		//测试类型转换方法ConvertStringToObject,尽量用这种方式,obj实际为Class<?> type
		Object obj = RequestParamUtils.getInstance().ConvertStringToObject(ss, String.class);
		log.info("String:"+RequestParamUtils.getInstance().ConvertStringToObject(ss, String.class));
		log.info("it:"+RequestParamUtils.getInstance().ConvertStringToObject(it, Integer.class));
		log.info("du:"+RequestParamUtils.getInstance().ConvertStringToObject(du, Double.class));
		log.info("date:"+RequestParamUtils.getInstance().ConvertStringToObject(date, java.util.Date.class));
	}
}


实体类:
package test;

import java.io.Serializable;
import java.util.Date;

public class Param implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 7834236561543851887L;
    private String userName;
    private Integer userAge;
    private Date borth;
    private Double weight;
    
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public Integer getUserAge() {
		return userAge;
	}
	public void setUserAge(Integer userAge) {
		this.userAge = userAge;
	}
	public Date getBorth() {
		return borth;
	}
	public void setBorth(Date borth) {
		this.borth = borth;
	}
	public Double getWeight() {
		return weight;
	}
	public void setWeight(Double weight) {
		this.weight = weight;
	}
    
}


控制台输出:
2017-1-6 16:28:11 test.RequestParamUtils main
信息: ======result:{"weight":56.3,"userName":"donald","userAge":20,"borth":{"time":1483691291811,"minutes":28,"seconds":11,"hours":16,"month":0,"year":117,"timezoneOffset":-480,"day":5,"date":6}}
2017-1-6 16:28:11 test.RequestParamUtils main
信息: String:user
2017-1-6 16:28:11 test.RequestParamUtils main
信息: it:2
2017-1-6 16:28:11 test.RequestParamUtils main
信息: du:50.36
2017-1-6 16:28:11 test.RequestParamUtils main
信息: date:Sun Oct 23 12:05:56 CST 2016
相关标签: bean java