Package com.xiaoleilu.hutool

Source Code of com.xiaoleilu.hutool.InjectUtil

package com.xiaoleilu.hutool;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import com.xiaoleilu.hutool.exceptions.UtilException;

/**
* 属性注入工具类
* @author xiaoleilu
*
*/
public class InjectUtil {
 
  private InjectUtil() {}
 
  /**
   * 注入Request参数<br>
   * 使用模型名称
   * @param model 模型
   * @param request 请求对象
   * @param isWithModelName 参数是否包含模型名称
   */
  public static void injectFromRequest(Object model, javax.servlet.ServletRequest request, boolean isWithModelName) {
    injectFromRequest(model, model.getClass().getSimpleName(), request, isWithModelName);
  }
 
  /**
   * 注入Request参数
   * @param model 模型
   * @param modelName 模型名称
   * @param request 请求对象
   * @param isWithModelName 参数是否包含模型名称
   */
  public static void injectFromRequest(Object model, String modelName, javax.servlet.ServletRequest request, boolean isWithModelName) {
    Method[] methods = model.getClass().getMethods();
    for (Method method : methods) {
      String methodName = method.getName();
      if (! methodName.startsWith("set")) {
        //只查找Set方法
        continue;
      }
     
      Class<?>[] types = method.getParameterTypes();
      if (types.length != 1)  {
        //Set方法只允许一个参数
        continue;
      }
     
      final String fieldName = StrUtil.getGeneralField(methodName);
      final String paramName = isWithModelName ? (modelName + StrUtil.DOT + fieldName) : fieldName;
      final String value = request.getParameter(paramName);
      if (StrUtil.isEmpty(value)) {
        //此处取得的值为空时跳过,包括null和""
        continue;
      }
     
      try {
        method.invoke(model, ClassUtil.parse(types[0], value));
      } catch (Exception e) {
        throw new UtilException(StrUtil.format("Inject [{}] error!", paramName), e);
      }
    }
  }
 
  /**
   * 从Map注入
   * @param model 模型
   * @param map map对象
   */
  public static void injectFromMap(Object model, Map<?, ?> map) {
    Method[] methods = model.getClass().getMethods();
    for (Method method : methods) {
      String methodName = method.getName();
      if (! methodName.startsWith("set")) {
        continue;
      }
     
      Class<?>[] types = method.getParameterTypes();
      if (types.length != 1)  {
        continue;
      }
     
      String fieldName = StrUtil.getGeneralField(methodName);
      Object value = map.get(fieldName);
      if (value == null) {
        continue;
      }
     
      try {
        method.invoke(model, ClassUtil.parse(types[0], value));
      } catch (Exception e) {
        throw new UtilException(StrUtil.format("Inject [{}] error!", fieldName), e);
      }
    }
  }
 
  /**
   * 转换为Map
   * @param model 模型
   * @param isOnlyBasicType 是否只允许基本类型,包括String
   */
  public static Map<String, Object> toMap(Object model, boolean isOnlyBasicType) {
    Map<String, Object> map = new HashMap<String, Object>();
    final Method[] methods = model.getClass().getMethods();
    for (Method method : methods) {
      final String methodName = method.getName();
      if (false == methodName.startsWith("get")) {
        continue;
      }
      final String fieldName = StrUtil.getGeneralField(methodName);
     
      Object value = null;
      try {
        value = method.invoke(model);
      } catch (Exception e) {
        throw new UtilException(StrUtil.format("Inject map [{}] error!", fieldName), e);
      }
      if(value != null) {
        if(value instanceof String || value.getClass().isPrimitive() || false == isOnlyBasicType) {
          //字段有效的三个条件:1、String 2、基本类型 3、或者允许非基本类型
          map.put(fieldName, value);
        }
      }
    }
   
    return map;
  }
}
TOP

Related Classes of com.xiaoleilu.hutool.InjectUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.