最近工作中遇到的9个问题(2019-08-16),每一个问题都留下了汗和水or血和泪

工作问题

1、公司名称“上海xx ”

合同名称“上海xx合同”
之前定的匹配关系是,合同名包含公司名称,则认为2者匹配。
但是,公司名称,包含了一个空格,所以匹配不上了。

trim之类的方法,可能是正解。
匹配方式,也需要更加信息化的方式解决,而不是在Linux的文件系统里匹配。

2、查询linux某个目录,同时包含2个字符串

find /logs/system/ -type f -iname "system.log.2019-07*" |xargs grep "雷哥"|grep "干坏事了" -i
linxu文件搜索支持模糊匹配,文件名可以"syslog"

3、mysql结果集ResultSet列别名

ResultSetMetaData.getColumnName 和 ResultSetMetaData.getColumnLabel的区别
简单的讲就是
对于查询语句select cd.id client_data_id from dual来说

ResultSetMetaData.getColumnName(i) 显示列名id
ResultSetMetaData.getColumnLabel(i) 显示列别名client_data_id
参考:https://blog.csdn.net/u011089766/article/details/54141985

4、Map属性copy到Bean

如果属性来源是map,需要用populate方法。
如果都是普通bean,用copyProperties才行。
(当然,Spring也自带了BeanUtils.copyProperties)

org.apache.commons.beanutils.BeanUtils
Map<String,String> map = Maps.newHashMap();
map.put("loginName", "123");
OaOrgMember oaOrgMember = new OaOrgMember();
BeanUtils.copyProperties(map, oaOrgMember );
BeanUtils.populate(oaOrgMember, map);

5、No converter found for return value of type:

public class Result {
private T result;
}

之前的getresult方法,命名不规范,不想影响以前的代码,
就增加了标注你的get和set。
但是2个都有的时候,提示报错,无法序列化。
具体原理还不太清楚,大概是和底层的实体类转JSON有关系。
可能是2个get/set方法,某个字段已经转json了,又来一次,就发生异常了。

/* public T getresult() {  
        return result;  
    }  

    public void setresult(T result) {  
        this.result = result;  
    }  
    */  
    //上面2个太尴尬了  
   public T getResult() {  
        return result;  
    } 
    
    public void setResult(T result) {  
        this.result = result;  
    }   
}  

6、maven打包疑惑

maven根据dev、pre、pro分3个环境打包。
maven默认为dev,本地启动dev正常。
上预发环境,maven -Ppre,把预发的配置放上去,pre启动正常。
然后,本地接着开发,由于maven默认dev,所以按说可以正常启动。
但是,却提示 数据库连接没有权限。

现象:必须maven重新默认install一次,默认 -P应该就是dev了。

猜测:pre打包后,本地残留是 pre配置。
Eclipse有target目录缓存,这个时候本地想再次跑,需要用 -Pdev或不带 -P参数,
再重新打包一次,再次启动才行。

7、深度copy业务场景和代码实现

场景:从数据库获得10个人的信息。
通过上下级,可以组合成1个tree树。
给外界提供接口,需要1个人的所有下属。
可能需要扁平化的结构,也可能需要有层级的树状结构。

由于是引用,在第2次构造树状结构的代码,修改了OrgMember的引用,
会使得扁平结构的List也包含了层次结构。

解决办法:深度copy。2个获得下属的方法,使用相同值,但不同引用的集合。
这样,就不会再互相影响了。

// 根据OA组织机构所有用户,找1个人的所有下属,支持2级  
	private OrgMemberList findAllJuniorMemberList(String superiorUsername, List<OrgMember> allOrgMemerList) {
		Map<String, OrgMember> orgMemberMap = JavaKit.listToMap(allOrgMemerList, "loginName");
		// 上级对应的oa用户,找不到,说明不存在,比如可能用户名不对
		OrgMember superiorOrgMember = orgMemberMap.get(superiorUsername);
		if (superiorOrgMember == null) {
			log.error("findAllJuniorMemberList,superiorOrgMember is null,superiorUsername={}", superiorUsername);
			return null;
		}
		List<OrgMember> newList = depCopy(allOrgMemerList);
		// 上级id,先找这个人的直接下级
		Long superiorId = superiorOrgMember.getId();
		List<OrgMember> juniorMemberList= doFindJuniorMemberList(superiorId, allOrgMemerList,false);
		List<OrgMember> juniorMemberTreeList= doFindJuniorMemberList(superiorId, newList,true);
		OrgMemberList orgMemberList = new OrgMemberList();
		orgMemberList.setJuniorMemberTreeList(juniorMemberTreeList);
		orgMemberList.setJuniorMemberList(juniorMemberList);
		return orgMemberList;
	}

深度copy代码
// 深复制,需要实体类实现了Serialiable接口
	public static <T> List<T> deepCopy(List<T> srcList) {
		ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
		try {
			ObjectOutputStream out = new ObjectOutputStream(byteOut);
			out.writeObject(srcList);

			ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
			ObjectInputStream inStream = new ObjectInputStream(byteIn);
			List<T> destList = (List<T>) inStream.readObject();
			return destList;
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

8 Mybatis(MybatisPlus)数据源 还是 直接数据库连接

系统需要连接OA系统,但是本地没有权限。
预发和线上才有。
项目需要同步OA数据库里的一张表。

最初打算,用MybatisPlus方便一些,CRUD更简单,但是本地没有权限连数据库,
启动就报错,影响项目开发。不太可能说,本地报错不管,预发线上不报错就行。

所以,只能采取不太好的折中办法。
自己维护一个数据库连接,需要访问的时候,再连接。
如果报错了,捕捉异常,不影响其它正常代码进行。

9 项目提交表单到第三方系统OA

OA系统需要一个附件。
提交表单需要的附件,用户有个界面可以选择。
选择的附件从第三方系统“文档库”,先同步到Linux机器上。

在用户看来,“选择合同”很简单。
但由于自己的系统和OA系统,不能简单地传输“URL”,需要先从Linux系统读取附件,
再提交给OA。

问题:文档库的附件上传,没有限制大小。
OA系统,附件大小支持多大,不明确。
自己的系统,读取附件,也没有判断大小。

OA提示异常信息:“不支持的事务类型”
排查思路:
a、线上,换个人重新提交,再换个人,都失败。 其他人正常。 b、预发环境,开票ok
c、对比成功的提交和失败的提交,字段区别,没啥变化
d、“不支持的事务类型”这个问题,第一次遇到。
参考最新文档,没有。
参考老文档,可能是某个字段不对,但是这个字段几个月都没有动过。
e、预发环境,出现过一次这个错误提示,原因是某个人在预发系统没有权限。
线上排查此人权限,有权限
f、再次考虑下对比字段,大多数字段都是普通字段,附件字段有1个。
可能出错,只有可能是非一般的字段,比如 金额浮点数有问题,字段缺失,附件缺失之类。
结合以前的经验,这次猜测附件可能有问题。
在预发完全模拟下,选择附件,发现失败。
预览附件,下载下来,发现有55M,确认就是这个问题。

普通的PDF,就是一些普通文字,没有“图片”,怎么会这么大呢?
有计算机知识的,都知道,几千个文字,5M以内肯定足够了,加上PDF格式原因,顶多10M。
仔细看看PDF文件,里面的“文字”不能选择 ,所以应该都是图片,
这个PDF是扫描版的。

解决办法:
a.从新扫描文件,或者压缩下大小。
b.先提交附件到OA,如果报错,能及时定位到问题,提示用户附件太大。
c.让OA支持,可以直接识别第三方文件系统的URL。
(我司的OA太差了,哎)

发布了1321 篇原创文章 · 获赞 2531 · 访问量 346万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 猿与汪的秘密 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览