影像调阅相关知识点记录

场景:最近调用发票识别的影像业务,涉及到几个以前未接触到的知识点,特此记录

知识点一:方法入参中,我们可以用一个List而不写具体实体类进行一个公共方法的调用

知识点二:map与实体类的互相转换

知识点三:便利Map,将每个字段的key和value解析出来拼接到soapenv中

知识点四:影像服务请求调用

知识点五:正则表达式截取两个字符串之间的数据

 /**
     * 调用国信影像系统数据初始化
     *
     * @param apiName  接口名称
     * @param pojoList 接口数据封装
     * @return 处理后的数据
     * @throws NoSuchAlgorithmException
     */
    public static String initXML(String apiName, List pojoList) throws NoSuchAlgorithmException {
        StringBuffer param = new StringBuffer();
        param.append(""
                + "" + ""
                + ""
                + "");
        param.append("");

        param.append("");
        param.append("");
        param.append("" + ImageConstant.CLIENTCODE + "");
        param.append("ImageCenter");
        String time = DateUtil.format(new Date(), "yyyyMMddHHmmss");
        param.append("");
        StringBuilder sb = new StringBuilder();
        String ticket = Md5Util.encode(sb.append(time)
                .append(ImageConstant.SERVICECODE)
                .append(ImageConstant.CLIENTCODE)
                .append(ImageConstant.KEY).toString());

        param.append("" + ticket + "");
        param.append("");
        param.append("");
        param.append("" + apiName + "");
        param.append("");

        for (Object obj : pojoList) {
            param.append("");
            // 将实体类字段转换成map
            Map objMap = EntityUtils.entityToMap(obj);
            // 根据map的不同,拼接数据放进xml中
            for (Map.Entry entry : objMap.entrySet()) {
                param.append("<" + entry.getKey() + ">" + entry.getValue() + "");
            }
            param.append("");

        }
        param.append("");
        param.append("");
        param.append("]]>");
        param.append("");
        return param.toString();
    }

 知识点二:公共方法类抽取:Map与实体类的互相转换

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

public class EntityUtils {
	/**
	 * 
	 * @description: 实体类转Map
	 * @param object
	 * @return
	 */
	public static Map entityToMap(Object object) {
		Map map = new HashMap<>();
		for (Field field : object.getClass().getDeclaredFields()) {
			try {
				boolean flag = field.isAccessible();
				field.setAccessible(true);
				Object o = field.get(object);
				map.put(field.getName(), o);
				field.setAccessible(flag);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return map;
	}

	/**
	 * 
	 * @description: Map转实体类
	 * @param 
	 * @param map    需要初始化的数据,key字段必须与实体类的成员名字一样,否则赋值为空
	 * @param entity 需要转化成的实体类
	 * @return
	 */
	public static  T mapToEntity(Map map, Class entity) {
		T t = null;
		try {
			t = entity.newInstance();
			for (Field field : entity.getDeclaredFields()) {
				if (map.containsKey(field.getName())) {
					boolean flag = field.isAccessible();
					field.setAccessible(true);
					Object object = map.get(field.getName());
					if (object != null && field.getType().isAssignableFrom(object.getClass())) {
						field.set(t, object);
					}
					field.setAccessible(flag);
				}
			}
			return t;
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return t;
	}
    public   T convertMapToBean(Class clazz, Map map) {
        T obj = null;
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
            obj = clazz.newInstance(); // 创建 JavaBean 对象


            // 给 JavaBean 对象的属性赋值
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (int i = 0; i < propertyDescriptors.length; i++) {
                PropertyDescriptor descriptor = propertyDescriptors[i];
                String propertyName = descriptor.getName();
                if (map.containsKey(propertyName)) {
                    // 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。
                    Object value = map.get(propertyName);
                    if ("".equals(value)) {
                        value = null;
                    }
                    Object[] args = new Object[1];
                    args[0] = value;
                    descriptor.getWriteMethod().invoke(obj, args);
                }
            }
        } catch (IllegalAccessException e) {
            logger.error("convertMapToBean 实例化JavaBean失败 Error{}" ,e);
        } catch (IntrospectionException e) {
            logger.error("convertMapToBean 分析类属性失败 Error{}" ,e);
        } catch (IllegalArgumentException e) {
            logger.error("convertMapToBean 映射错误 Error{}" ,e);
        } catch (InstantiationException e) {
            logger.error("convertMapToBean 实例化 JavaBean 失败 Error{}" ,e);
        }catch (InvocationTargetException e){
            logger.error("convertMapToBean字段映射失败 Error{}" ,e);
        }catch (Exception e){
            logger.error("convertMapToBean Error{}" ,e);
        }
        return (T) obj;
    }
}

知识点三:便利Map,并将key和value解析出来

  for (Map.Entry entry : objMap.entrySet()) {
                param.append("<" + entry.getKey() + ">" + entry.getValue() + "");
            }

 知识点四:影像服务请求调用注意要点

1、soapenv需要添加请求头:SOAPAction和Content-Type,不然访问不到

影像调阅相关知识点记录_第1张图片

 //发送请求
        HttpHeaders headers = new HttpHeaders();
        headers.add("SOAPAction", "");
        headers.add("Content-Type", "text/xml;charset=UTF-8");

        String request = initXML.toString().replace(">null<", "><");
        HttpEntity formEntity = new HttpEntity<>(request.toString(), headers);
        ResponseEntity responseEntity = restTemplate.postForEntity(wsdlURL, formEntity, String.class);

 知识点五:正则表达式截取两个字符串之间的数据

1、如果是首尾相应的话,String rgex = "(.*?)";

2、如果首位不规范,截取方式如下:

开始,.*?是省略中间的数据,一直到遇到>位置

以<结束,用([^]+)包住截至的符号即可,整合如下:([^<]+)

Pattern pt = Pattern.compile("([^<]+)", Pattern.DOTALL);

3、字符串如果有特殊符号,如"<"或">"或"["或"]"或!等符号,我们要用\\进行转义

String rgex = "\\\\<\\!\\[CDATA\\[([^]]+)";

/**
 * 正则表达式匹配两个字符串之间的内容
 * @author Administrator
 *
 */
public class RegexUtil {

    public static void main(String[] args) {
        String str = "w764e:\1.xml1单据w764开始处理...单据w764处理完毕!2017.09-记账凭证-1w1007e:\1.xml1单据w1007开始处理...单据w1007处理完毕!2017.10-记账凭证-1w516e:\1.xml1单据w516开始处理...单据w516处理完毕!2017.07-记账凭证-50";
        //String str = "abc3443abcfgjhgabcgfjabc";
        String rgex = "(.*?)";

        System.out.println((new RegexUtil()).getSubUtil(str, rgex));
        List lists = (new RegexUtil()).getSubUtil(str, rgex);
        for (String string : lists) {
            System.out.println(string);
        }
        System.out.println((new RegexUtil()).getSubUtilSimple(str, rgex));
    }

    /**
     * 正则表达式匹配两个指定字符串中间的内容
     *
     * @param soap
     * @return
     */
    public List getSubUtil(String soap, String rgex) {
        List list = new ArrayList();
        Pattern pattern = Pattern.compile(rgex);// 匹配的模式  
        Matcher m = pattern.matcher(soap);
        while (m.find()) {
            int i = 1;
            list.add(m.group(i));
            i++;
        }
        return list;
    }

    /**
     * 返回单个字符串,若匹配到多个的话就返回第一个,方法与getSubUtil一样
     *
     * @param soap
     * @param rgex
     * @return
     */
    public String getSubUtilSimple(String soap, String rgex) {
        Pattern pattern = Pattern.compile(rgex);// 匹配的模式  
        Matcher m = pattern.matcher(soap);
        while (m.find()) {
            return m.group(1);
        }
        return "";
    }
}

通过这个业务场景学习到的一些知识点,特此记录,希望自己能温故知新

你可能感兴趣的:(工具类,http请求头含义,大数据)