题目

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

难点

数组,二分法

解题思路

方法1
递归二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
public int search(int[] nums, int target) {
int begin = 0;
int end = nums.length - 1;
if(nums[0] > target || nums[end] < target){
return -1;
}
if(nums[0] == target ){
return 0;
}
if(nums[end] == target){
return end;
}
return binarySearch(0, end, nums, target);
}
public int binarySearch(int start, int end, int[] nums, int target){

if(nums[start] == target ){
return nums[start];

}
if(nums[end] == target){
return nums[end];

}
int half = (end - start) / 2 ;
if(half == 0){
return -1;
}
int halfnum = nums[half + start];
if(halfnum == target){
return half + start;
}else if(halfnum < target){
return binarySearch(half + start, end , nums, target);
}else{
return binarySearch(start , half + start, nums, target);
}


}
}

思路2
看了题解,理解了二分法,又重新实现,关键在于边界的选择,开闭,通过理论的分析,比自己写的要很很多。
二分法的适用条件,1.没有重复数据,2.有序数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {

public int search(int[] nums, int target) {

int left = 0;
int right = nums.length - 1;
if(nums[0] > target || nums[right]< target){
return -1;
}
while(left <= right){
int middle = left + (right - left) / 2;
if(nums[middle] > target){
right = middle -1;
}else if(nums[middle] < target){
left = middle + 1;
}else{
return middle;
}
}
return -1;

}
}

之前的@Test注解跟之前junit4的差别不大,都是编译期就确定的,运行期不能改变。
Junit5添加的Dynamic test就是为了弥补这一不足。Assumptions提供了比较基础的方式提供的动态行为。

Junit Jupiter引入的全新的编程模型,使用@TestFactory 在运行期生成工厂方法,来实现动态行为。
@TestFactory与@Test 比本身不是测试用例,是测试用例的工厂,一个dynamic test是共产的产品。
@TestFactory必须返回,一个单独的 DynamicNode 或 一个 Stream, Collection, Iterable, Iterator, 或 DynamicNode 实例数组。
DynamicContainer和DynamicTest是DynamicNode的子类。DynamicContainer是一个显示的名字和动态节点的集合。
DynamicTest 实例会延迟执行,即使没有明确的用例,也会动态化。是显示名字和Executable组合,Executable是@FunctionalInterface接口可执行lambda表达式。

6月1号前,小区就全解封了,封闭的铁皮都拆掉,还没等1号的到来,已经全解封了。
今天是3号,出去坐了地铁,逛了商场,堂食还没开,本来大吃一顿,但看来吃不成,买了个烤肠和烤猪蹄,商场外面啃了啃就回家了。
从4月10多号封闭到6月份,2个多月了。
想起刚封闭的时候,当天我刚从单位的封闭3天解封出来,但过了多久有点记不清了。在单位隔离的几天真的难受,还要上班,还要发版,晚上也睡不好,凳子上躺着腰很难受,一会一醒,周围鼾声也很大,睡的很难受。
封闭前一天,新闻里听了上海疫情有点严重,但看我小区还没封闭,只有几个楼栋口封闭,本来想老小区,老年人多,疫情肯定严重,但没想到,还行,还挺乐观,当晚我们跟我在路上视频,问候情况,我还大大咧咧说没事,都挺好的。但听到不远处就有警车声,看到警车,感觉就不太好。晚上还特意出去逛逛,但也没买啥。没想到这是最后一次出去了,第二天我居家办公,欣欣出门上班,不一会就回来了,说小区封闭了,出不去了。当时还觉得挺高兴,不用通勤上班了,但没想到再出去都过去2个月了。

虽然我们被隔离在小区,但还好可以远程上班,工作不耽误,工资照发。开始高兴,每天省2个小时的通勤时间,爽。但慢慢变得每天24小时工作,没有了下班时间,以前还可以说,下班了,没带电脑,明天再说。但现在24小时都在,每天醒了就上班,一直工作到10点多,然后睡觉。最终两点一线,省去通勤时间,全是上班,完全没有下班了。
加班我觉得跟我自己有关系,白天工作,经常有人找,都是帮别人解决问题,自己想干的问题,只能在别人完成后,晚上或周末抽空做,完成你自己的事情,才能完成你的绩效,对自己工作安排的还不太到位。

之前一户可以出去一个,我就出去了,第一次出去,除了保供的商店,其他都还用铁皮拦着,但第一次出去的时候街上人也挺多了,我就去联华排队买东西。我们这个老小区的超市很奇怪,之前我是比较适应大超市,比如家乐福、沃尔玛的,但这些大超市距离都有点远,反正是国内的联华超市,基本能买到生活必须品,价格也还可以,虽然小一点,装修、东西差一点,但该有的都有。满足需求,反而大家都去,更实在。当时8点多出门,去了就先排队超市,队伍特别长,8点半开门,差不多排了1个小时,9点半进去了,里面人还可以,东西还会挺多,但酸奶啥的没有了,调料也不全了。买了必需的东西,出门继续逛逛其他地方,去了肯德基那边,茶百道开了,人有点多,就没排队,肯德基什么都没开,后面去了侧门逛逛,但铁皮基本没拆,就回去了,东西很沉,也走了很远,很累。

后面第二次出去,基本拦商家的铁皮都拆了,但就10点多出去,也没想多逛,如海超市逛逛,就回去了。再后面就全面解封了,上海这次解封,真的太快了,封闭磨磨叽叽,导致扩散严重,小区内疯狂传染,开始感觉没怎么出去,但小区内突然一栋栋封闭,后面又更魔幻的,突然没有新增了,再后来就是突然全面解封,感觉还没都清零,但说解封就全放开,自由出入。然后上海严重的时候,中风险一个没有,现在全面放开了,又开始有中风险了,都清零了,又开始有确诊了,离谱的是还确定了中风险,我们隔离2个月,本来应该有赔偿的,但现在啥都没有,就因为不是中风险。

这段封闭对我们来说,还算舒服,吃穿不愁,就是每天上班有点累,不能出门有点烦,对于某些人来说就是生离死别, 有基础病的老年人,不会用智能机,不知道怎么抢菜。 有重病要看医生的,出不去。

不管怎么说,多面手是必要的,生活各种方面都要重视,才能在恶劣的环境中生存。

首先你要负责一个重要的领域,这个领域可能困难比较多,问题比较大,但它确实重要,大家都知道它重要,但又害怕他要带来的付出。
选出一个领域,然后不断深入,划清楚自己的边界,不要什么都负责,什么都做也什么都不会突出。

拿我自己的一个例子,开始进新部门,因为工作年限长,和另外一个更长资历的同事,同时当两个组长,也因为另外一个同事会刷锅,我也觉得自己什么都能干,所以我承担了很多工作,然后干不完,问题突然抛给了领导,领导虽然临时找了其他人负责,但也因此丢了组长。后面因为领域划分,每个人都负责一部分,我当时想进度件是进度件里最重要的,当时大家都知道进度件东西多,容易出生产问题,大家都不愿意接,我主动接下最重要,最困难的一个部分。我也不确定这个决策对不多,后面很多次后悔为什么选了这么个难做的东西。但随着这部分需求逐渐增加,每个版本都需要很多人去做,这部分也是我们不多的上级重视的部分,所以我又重新有了竞争的实力。从之前大包大揽,什么都没做好,到现在领域清晰,做的被重视,可以看出形势是不断变化的,一个骚操作就会败北,但一个正确的决定又可以重新回去。

如果选定领域,
1.工作内容足够多,每个版本都有改动,而且很多人使用。
2.大家知道重要,但问题也多,怕担重任,想想后面就很多事情。
3.上面领导重视,觉得这部分很重要。
4.边界清晰,不能什么都做。

回顾如何开发一款给别人使用的公共框架

开端:趟了无数的坑,初步感觉有一些公共的功能可以提炼。
像我们这个前端系统,转发是关键,接口处理很简单,调用其他系统多,数据库处理少,字段透传,不知道有什么字段。有隐私字段透传出去
字段映射就是想知道字段以及裁剪数据,后端结构烂七八糟。
请求其他系统很多,逻辑一大段耦合在一起。

过程:想道要划分小模块,减少耦合。产生做流程编排的想法。

找相似功能,云函数,亚马逊的lamadb表达式。但没找到开源实现。

分离变与不变
做了状态容器,启动去初始化

上下文数据是基于原来的入出参对象比较大的问题,从登录实践来

流程与线程进行绑定隔离,是壁仓的想法

第一次做这个事情,依赖不太会注意,以前各种三方jar包各种依赖,现在看来还是少依赖好。

初始功能完成就要进入实战阶段,来检验以前的想法

我对一个事物,从陌生到熟悉,开始会不断找这件事的不同之处,明白或熟悉之后,就会进入自动模式,按照之前的既定模式去行动,减少思考,这样,相当于更省力,效率也更高。但并不是所有情况下,按照习惯都是好事。

就比如我的一个习惯,就是回家放松就是看视频。这个是放松杀时间的习惯,时间不知不觉就过去了。如果这个习惯经常被触发,就会导致我不知不觉时间就没了。

让我想起原则这本书,人面对不断变化的生活,要做各种决策,怎么做的又快又好,看来最好的方法不是当时去想对策,而且提前做好思考,不同场景提前想好,那到了做决策的时候,就能很好的下判断。

习惯就是我们对日常的情况,养成的一种处理方式,比如放松,我就选择看视频解说,既满足了我内心看多个电影的需求,又节省了时间,也不花精力,看起来是个双赢的选择。但演变到现在,不管什么时候有了空闲时间就刷视频,即使有了大段的时间,可以攻坚一些事情,也还是刷视频。
表面上在一个场景下适合的习惯,如果不能控制使用场景,就会演变成一个坏习惯。

习惯的力量又是强大的,很容易让人进入自动模式,不受控制的做。所以能主动意识到什么情况下该做什么很重要,能反思什么情况下自己进入了自动模式,什么情况自己该进入什么自动模式,极其重要,每个人的时间差不多,不走弯路,可以节省很多时间。

最早听到这个是在上一家公司,当时公司做的一款产品是走高端路线,但实际水平并没达到,但概念吹得足够响。但有的时候吹的太高,导致很多客户付款后到实际上线,心里落差很大,尾款结算不顺利。或者是预期太高,结果实际差距导致没有购买。我就听我们当时总经理提到预期管理,不能给客户太高的预期,预期是150,即使你现在已经不错了,到了90分了,客户也会觉得不好,但如果开始给客户的预期事80分,你到90分已经很好了,即使东西没变,客户的体验会好很多。

想想这个结合最近部门来了一个职位更高的技术专家,我们本能的对他的预期更高,我们做不到的,做不好的都给他,让他去做,心理上也心安理得,毕竟人家职位更高,按理应该能力更强,对他的预期很高,如果他跟我们完成一样的东西,我们就会觉得不行,虽然东西一样,但是评判标准就会变化,会自然的提高。

所以对于领导的预期也要有管理,最近部门长给我们定目标,想做一个引擎,解决所有问题,虽然理论上可性,但实际上没有用的地方。如果这个时候,答应下来领导,领导的预期很高。最后我们做出来的东西很难,给领导留一个好印象。
预期、实际结果与体验有几种关系,

实际结果远低于预期,体验最差。
实际结果达到预期的最低标准,体验差,但勉强过得去。
实际结果达到预期,体验一般,勉强可以。
实际结果超过预期一点,体验良,不错,会越来越好。
实际结果超过预期很多,体验优,真不错,比我想还要好,有前途。
事件结果超过预期,有我都没想到的点,体验超凡,非常好,比我都强。

从上面几种关系上看,第一给领导预期不能太高,如果太高,不管你实际结果是什么水平,只要没达到预期,都会很差,即使你做的不错。不管怎么说,职场上下级,始终是人的关系,最终结果是一回事,给人的感觉是另外一回事。
我们要做的第一件事,是降低实际预期。让目标更容易达到,第二个是到达目标。第三个是能超出预期,做一些意想不到的。这样你的上下级关系会更容易维护好。

之前都在小企业,虽然也很忙,但大家顶多是多做点,不致于互相推卸责任。但到了大企业,互相推卸责任反而是一个必备技能,小企业需求没那么多,提要求的人也没那么多,所以能做或想做的事情也不会太多,但到了大企业,你都说不好有多少人对你提要求,过程管理,安全,集团要求,A、B、C领导对你期待不同。所以你想做一些自己觉得重要的事情,就要尽量避免帮别人做一些不重要的事情,而且有些事情做了还不如不做,收益不大,风险极高,做了之后可能后面这些事情就都要你做,因为你做过。从自身经验这就是推锅的起源。

我就是这么学会推锅的,开始觉得领导重用我了,就开始大包大揽做所有事情,正逢当时手下也没几个人,就全自己动手,然后一号技术负责人再是一个会推锅的人,他也会源源不断推给你一堆事情,然后你手头工作不断挤压,加班不断,因为加班强度大,犯错也增加,恶性循环,这个时候你醒悟做了这么多,不会有人说你好,反而当你出错,一堆人会批评你,这就是费力不讨好,然后我也学会了推锅,能推给别人的尽量不自己做,少做不加班,错的也少,何乐而不为。效果明显,简直就是必备技能,技能越强,受益越明显。

想想之前曾经推锅的人都是吃了被推锅的亏,吃一堑长一智,才不断推锅,然后现实就演变成了一场推锅大会,大家会花很多时间去推锅,大家都知道这样不好,但不这么做,自己明显吃亏,肯定屁股决定脑袋。

对于推锅,领导肯定明白,但这就会导致他想做的事情,大家推来推去,没人去做,这样他的目标就达成不了,这样在他的角度必然讨厌推锅的人,认为这样是不负责任的,严厉打击,所以大家把推锅用其他语言包装一下,领域划分,架构划分,用机制解决冲突,既要表达不该自己做,又不能表现出什么都不愿意做,绞尽脑汁用其他理由去包装,推锅变成一场博弈。

有了推锅,大家学会了反推锅,你提出问题,你提解决方案,给提出问题的人反抛出一个难题。你让我难受,我也不让你好受。解决不了问题,就解决提出问题的人。

接了锅有没有好处,做得越多,你对系统,业务越了解,你未来走的越远。
这是一个短期与长期的收益的关系,长期收益不明显,短期受损很明确。

解决方法?
大家职责范围清晰,没有交叉,临时工作依次承接。但职责清晰有点难,总有些临时的,不确定范围的东西,不能避免。大家偶尔接触别人领域,大部分在自己领域。
推锅实际上是博弈,人与人的,最好一整块都是一部分人的,减少交叉,但交叉不可避免,还需要有机制处理这些博弈的问题。

批判性思考的详细目录
1.究竟是哪些因素塑造了我的个性?它们是如何实现这一点的?我的自我形象如何受到了影响?由于这些影响,我在哪些情况下比较缺少个体性?
答:我的父母,父亲的胆小节俭,母亲的品质,整体父母的认知高度,家境一般,对钱比较吝啬,独生子女,对关系处理没有经验,喜欢逃避,父母经常吵架,喜欢逃避到学习里,后面远离家,主动逃离家庭。

恋爱让我对于亲密关系,有了更好的理解。
教育塑造了我的性格,只追求学习

2.我在哪些方面像是一个好的思考者(如第二章所概述的)?我在哪些方面像个拙劣的思考者?哪些类型的情形看起来显示出我最好和最坏的品质?
答:对于自己熟悉的内容,比如软件方面,但对于自己完全不了的东西,几乎只能用直觉去思考

3.在多大程度上我对真实情况的观察是合理的?(如有必要,再看一下第三章)
答:反观之前的观察,很多可能都是不合理的,对于自己不涉及其中的,很多都是客观的合理的,涉及自己的不由自主的会双重标准,默认模式一下接管,对事物的观察也不那么合理,之前从来没想过这些问题,也没反观过思考过程,以为想一下就算思考了,现在看来有些幼稚。

4.我是如何仔细地把传闻、谣言和事实分开的?如何把已知的与假定或猜测如何区分?对我而言,说“我不知道”有多难?
答:传闻、谣言和事实,现在我也不能很好的分清楚,没有办法去考察,就都不当成事实去认为,只有仔细搜索,多个地方作证,才算事实。
已知、假定、猜想。三者很难区分,已知的可能是不对的,假定的时间一长没有验证,可能就认为是事实了,猜想也一样,很多时候没有经历去验证,就认为是事实,

5.我在设法把我的观点有事实根据时时如何前后一致的?
答:我也是经常颠倒顺序,一般是先提出自己的观点,再去寻找能支持自己观点的证据,因为没有观点被认为是无能的,所以我们会先有一个观点,然后再去找支持观点的证据,但这个时候,你已经有了结论,就没办法客观的面对事实了。

6.我在多大程度上认为“我的更好”(不仅是个人的“我的”,而且也是族群中心主义的“我的”)?这种思维在哪些方面影响我对个人问题和公众议题的看法?它在多大程度上影响了我倾听那些不同意我观点的人的能力、我控制自己情感的能力、和我改变自己的想法并修改一个判断的意愿?
答:大部分情况,我都会持有我的更好的观点,而且拿自己长处比别人的短处,以获得优越感,然后放弃对别人长处的学习,心安理得。继续生活。而且对于族群也是持有我的最好,而且没有想过这有什么不对。对于别人的问题,我只认为别人蛋疼,自己的问题却很重要,认为自己比别人优秀,果断。但其实没有,只是没有去思考过这些问题。

7.在哪些事情上,我倾向于假定得太多,把太多的东西当作理所当然的?
答:对于不熟悉的事情都有很美好的假定,比如大公司肯定更美好,各方面都很优秀,不会有这么差的恶人,但其实人都一样,不能排除任何情况。不能想当然,别人应该怎么做。

8.我在多大程度上倾向于要么/要么观念,期望正确的答案总是极端的而绝不是中庸的?
答:很多时候会这样,尤其冲动的时候,要么能去大公司,其他拒绝你的公司,我自己都看不上,别人的努力在我眼里一文不值。期望别人能解决问题,如果给出了模棱两可的回答,就觉得跟没说一样,别人没有给出简单的解决方法,觉得别人不行,傻逼,自己做的时候没做好就是条件导致。

9.我对什么或谁感到最强烈的遵从的冲动?在哪些情况下,这种遵从习俗冲动的倾向干扰了我的判断?
答:对于权威,比如领导的话, 习惯于准从,然后放弃思考的,放弃去管这些事情,不能完全相信警察,等公职人员,他们也是人,会受上面的压迫,受个人思维的影响,导致出错,对于一些崇拜的人话,也是不加思索,比如当时确信李笑来的话都是对的,但也没多方面去思考,各种情况,就使用,觉得自己很厉害还高人一等,其实只是听了别人的结论,瞎用。

10.我倾向于世一个要求真理是整洁和简单的绝对主义者,还是一名声称每个人创造他或她自己真理的相对主义?我的性格倾向于在哪些方面妨碍我发展成批判的思考者?
答:我更倾向于要求世界是简单和整洁的绝对主义,如果别人没这么做,就是他们没做好,我要是做不会这样。性格中的妥协,如果有些困难可能很容易就放弃。

11.在哪些问题上我对变化的偏见最大?我过分地接受改变还是过分地抵制它?这种倾向的原因是什么,我如何最好地控制它?
答:对于我熟悉的东西,对于变化偏见很大,可能会影响到自己,如果跟我没关系,倾向于变化,反正对我没有影响。而且对于不了解的变化,比较抵制,因为这些自动不懂,很恼怒,不如自己懂得,显得自己厉害。对变化,要看本质,找因果。

12.在哪些情况下,我试图证明自己的偏见而不是控制它们?在哪些情况下我以逢迎自己偏见的方式去解释证据?
答:别人挑衅自己的时候,我总是证明自己,为了给自己找面子,显得自己强一些。为了表现自己的时候,都是这样,汇报工作,等期待结果的时候。

13.我如何经常地使用双重标准地解决问题,忽视赞同我观点的论证中的缺点,而挑剔那些反对我观点的论证?
答:当你花很多时间,去给出一个解决方案,你就很难理智的判断的,你花了时间,不想浪费,所以千方百计去维护,尽量不显得自己像白痴,浪费了很多时间,又一事无成。

14.我在多大程度上倾向于跳跃到结论?我在某些领域更倾向于如此?如果有,那是哪个领域?我完全为了方便而草率得出结论吗?我受到听起来有权威性和令人印象深刻的欲望所驱使吗?
答:当会花很多时间或精力的情况下,我倾向于直接寻找别人的答案,而不去证明,节省时间,赶紧解决这一个,进入下一个。

15.我过度概括到什么程度?我最容易接受哪些类型的刻板成见?种族的?宗教的?族群的?
答:最典型的刻板成见就是来自我爸,什么南方人精明,哪个地方的人怎么样,用一个地方代表一个地方人的所有特性,我在上海看到对上海人的刻板印象是很明显的。

16.我在多大程度上过度简化复杂的事情?我只是不愿费力从复杂性上了解真理,抑或我感觉受到不整洁、不简明的答案所威胁?是什么使我这样?
答:过度简化有的时候是懒惰,截止时间的压力,等,赶紧解决手头的工作,对于能交代即可。

17.我经常犯哪些表达的错误?我推论如果B跟随在A之后,那A必定是B的原因吗?我为了避免困难或尴尬的讨论而转移议题吗?我自相矛盾,作循环论证,作出无意义的陈述吗?我把真实的权威与虚假的权威相混淆吗?我作出错误类比吗?我运行非理性的诉求吗?
答:我有的时候喜欢强行解释,自己还感觉自己在搞笑,但实际可能在别人看来就是胡扯。抬杠。

18.下列哪些错误最能体现我对质疑和批评自己观点的说法作出反应的特征:自动拒绝?转移举证责任?“稻草人”做法?攻击批评者而不是讨论问题?
答:攻击批评者,说你也怎么怎么做,我也就这样了,既然你也不行,你凭什么提出这样的要求,大家都这样。不自觉的转移话题,听成别的问题,没有完全听明白的情况下,就说了自己熟悉的内容。

起因是因为,最近在做公司的项目,我做的是前端系统,取数据需要调用后端系统,我能做的事情不多,所以对于返回值校验这块起来兴趣,而且我们调用后端接口,是内部的一个服务平台。我们前端的微服务,有一个微服务作为统一的调用内部服务平台的入口,所以先通过feign调用到这个组件,再通过这个组件去调用内部服务平台。这样做的好处是,只需要配置一个地方的服务平台参数,就能所有服务公用。但用的不舒服的地方就是返回值是一个map,没有类型信息,不清楚里面有什么值,好处是通用。所以我还是想用bean去接收返回值,然后去校验字段,处理这些异常。

提取出问题的几个关键点,内部服务平台因为所以服务都需要用,但每个微服务都配置麻烦,所以就集中一个微服务配置,其他服务通过feign调用,该组件集中调用内部服务平台,然后透传给每个微服务。我们将该调用内部服务平台的微服务定义为A服务,A服务与其他微服务为了通用,就使用map作为返回值,因为不想每次都开发新接口给每个微服务,因为A服务没有每个接口类型信息,所以也就不能给每个调用者转类型,这也是一种处理方式。然后每个微服务自己从map里取值,通过map在业务里传递,完成处理。这也是一种行得通的设计。

但这种设计的缺陷就是,后面的人不好维护,非开发的人找不到接口里到底有什么值,map没有任何类型信息,字段意义,开发方面,但维护成本高。所以我倾向于使用bean去作为接收对象,在业务中传递,既可以校验,也有字段信息,缺点就是可能bean会很多,膨胀的很厉害。这是以编译期类型信息代替运行时类型信息。这就是第一个分歧点,使用编译器校验还是运行期,表面上的争议是bean还是map。

我要实现的功能是返回值字段校验与统一校验异常处理,
思路1,如果返回值是map,那就一个个字段取出,校验,然后处理异常。缺点:人工做,容易错误,繁琐。好处:效率高。
思路2,返回值还是map,map转bean,然后bean做校验处理。后面的bean的校验统一用hibernate validator处理。缺点:map转bean,多种方法实现,反射等方法有性能较低,高性能转换需要引入其他框架。
思路3,返回是bean,在使用其他方面,单独校验处理异常。
这里有一个重要的点,就是调用使用的feign调用,业务B服务,调用A服务,A服务会进行json转换,再调用内部服务平台,返回值,再json序列号,发给B服务,B服务的feign再反序列化。
思路3.1,A服务要有B服务的返回值类型,然后在内部平台返回时,先反序列化成B服务的类型,再返回给B,这样A服务,要有所有服务的类型信息,不太合适,A服务应该不频繁改动。
思路3.2,A服务,既然不能有类型信息,那就不解析,直接透传呢?好像问题解决了。因为内部平台正好也是json类型的返回值,直接在A服务,不解析json,直接返回给B,B用类型信息去解析,这是透传还不能消耗json解析的时间。这个地方,返回值使用string,然后produces使用json,spring mvc可以直接返回json。返回bean的第一个问题,解决了,可以不用map,直接在B服务用Bean去接收。

然后是校验的部分,
思路1,独立的部分去校验bean,返回值校验失败返回值,但不抛异常,单独一个方法再包装抛异常
思路2,在feign的decode的时候,去解析bean,校验字段,抛异常
这两个思路应该都支持,第一种更通用,第二种更简单。

在feign的前后做好校验与异常,相当于定了接口,对于不同系统的管理也更方便。

总结:通过不解析json进行透传,省略中间服务类型转换。通过feign前后encode与decode的重写,来处理bean的校验和异常的处理,bean的校验框架使用hibernate validator进行。