场景:最近调用发票识别的影像业务,涉及到几个以前未接触到的知识点,特此记录
知识点一:方法入参中,我们可以用一个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() + "" + entry.getKey() + ">");
}
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() + "" + entry.getKey() + ">");
}
知识点四:影像服务请求调用注意要点
1、soapenv需要添加请求头:SOAPAction和Content-Type,不然访问不到
//发送请求
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 = "w764 e:\1.xml 1 单据w764开始处理...单据w764处理完毕! 2017.09-记账凭证-1 w1007 e:\1.xml 1 单据w1007开始处理...单据w1007处理完毕! 2017.10-记账凭证-1 w516 e:\1.xml 1 单据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 "";
}
}
通过这个业务场景学习到的一些知识点,特此记录,希望自己能温故知新