疯狂编程
![](https://i-blog.csdnimg.cn/blog_migrate/a4e4ae7c0350bd839429f1e29d8a0475.png)
每个人都喜欢浪费典型工作日无休止的苦恼。 会议,同事打扰,设备不足,Reddit ..感觉时间已到,除了手头的任务。
但是,让我们暂时搁置所有这些。 您在您的区域中。 没有分散注意力或视线的干扰。 甚至没有Reddit。 我们花费大量时间不编写代码,而是在浏览器上寻找答案。 回答您不想问的问题。 最愚蠢的事情可能需要几天才能解决,使您发疯,并使您考虑职业选择。 但是我们在找什么呢? 为什么在任何给定时间都有50个选项卡打开,其中有一半是堆栈溢出?
我最近从头到尾编写了一个应用程序 ,我想回答这个问题。 这个项目是开发人员的梦想,因为它完全是未开发的项目,只有一个人要怪(我),而我有一个非常具体的功能列表,它们不太可能更改或增加。 我完成了整个堆栈(Kotlin,Spring,Bootstrap和Angular)—从项目创建到将其部署到Docker容器中的云中的所有过程。 我的新生儿花了大约两个月的日历时间,大部分时间是一两个小时。
从某种意义上说,堆栈是典型的,它包含了我非常熟悉的内容(Spring),有些知识(例如Kotlin,Angular,Bootstrap)对全新领域(如Google Cloud和Spring Webflux)的了解有限。 为了纯粹的学术兴趣,我还添加了一些元素(JWT令牌,已公开)。
那么,时间到哪里去做这样的事情呢? 基本上,所有编程任务都从分而治之开始-设计总体架构,然后将问题分解为更易于管理的部分,并开始一一解决。 数据库。 UI视图。 REST请求处理。 身份验证。 CSS。 在上。 对于任何有经验的程序员来说,这种划分都感觉像是第二天性,而当您进入生活时,生活就好像值得生活。 然后来惊喜。 “我的紧急威士忌在哪里”的东西,会让你拔头发(我秃顶)。
不需要花两天时间就能解决的问题类型的事情会让您发疯。 例子不起作用。 构建突然失败。 配置选项似乎无效。 依赖项发布的补丁破坏了一切。 错误代码。
![](https://i-blog.csdnimg.cn/blog_migrate/e9daf65a940e09e2ce796605e860a564.png)
出于兴趣,我写下了我在途中遇到的最大的惊喜问题,这些问题花了两个多小时才得以解决,并使我更加接近疯狂的边缘。 其中许多可能是他们自己的帖子,并为在那里的下一个吮吸者节省了一些头发,但是我将简要介绍其中的一些问题和解决方案。
使用Spring Boot的JWT令牌不起作用
那里有指令 ,但是会话数据并没有在Spring内部持久存在。 根据Spring的规定,无论我对自己进行多少身份验证,我始终都是匿名用户。 我花了最长的时间调试了Spring请求处理的内部,直到我弄明白了为止。 事实证明,使用@Autowire将Spring SecurityContext传递给类是一个坏主意。 每次使用SecurityContextHolder 。
经验教训 :如果您在使用库时遇到麻烦,并且很幸运可以使用所有代码,请查看代码。 凝视并调试足够长时间,您可能会发现。
也许我应该尝试做汽车修理工?
如何从已公开交易中返回数据?
( 公开的是Kotlin的ORM)。 在框架中,您将数据库操作包装到如下事务中:
transaction {
val dao = UserDao.find{ name eq someName }
dao.password = newPass
return toPojo(dao) // Error
}
我想从该事务中返回某些内容(带有更新数据的POJO),但是不允许return关键字。 我什至不知道该如何解决这个问题。
经验教训 :Kotlin高阶函数返回最后一条语句,而该事务只是带有lambda参数的方法。 所以最后一个例子就是:
transaction {
val dao = UserDao.find{ name eq someName }
dao.password = newPass
toPojo(dao)
}
由于某些莫名其妙的原因,我的大脑没有与Kotlin lambdas建立联系 ,我认为这是另一种魔术。 我真正需要做的就是查看事务功能的定义方式并对其进行适当的内部化。
没有魔术,只有您不了解的事物。 如果魔术失败了,您在使用前先停下来弄清楚。 疯狂地寻找解决您不了解的问题的解决方案将无济于事。
也许有酿造的机会?
Spring路由中的角路由错误
在Spring中,您可以使用WebSecurityConfigurerAdapter类声明安全规则,以解析每个URI的方式,从而可以绕过会话身份验证等。但是如果我在Angular中使用路由,即使用不同URI的不同控制器。 Spring变得很健康,并吐出错误。
经验教训:事实证明您需要以下内容:
确保所有请求(与其他Spring路由规则不匹配)都转发到index.html ,并从那里转发到正确的Angular控制器。 Google将为您提供各种已过时的不再可用的版本。
也许是水管工?
Spring JUnit测试失败
我同时遇到两个问题,Spring Context加载无法按我想要的方式工作,并且自动装配字段很不稳定。 例如,上下文没有加载用YML编写的配置文件,尤其是在集成测试中。 而且,现场注入在测试上下文中不太有效。
经验教训:事实证明您不能在测试属性中使用YML (查看受支持的格式)。 如果可以避免的话,也不要注入字段 。 更好的是,如果可以避免的话,请完全避免使用Spring。
垃圾人?
通过ConfigurationProperties进行配置
与上一个部分相关的ConfigurationProperties虽然很酷,但工作起来却非常痛苦。 再次说明,魔术系数过高-通常,已定义的配置POJO只是说空,而我不知道该怎么做。 他们不在单元测试中工作也没有帮助。
经验教训:有时无休止的修补是您所能做的。
蒸馏怎么样?
公开的多表查询
再次暴露出困境。 我不知道如何编写涉及多个表的查询。 最后,我问了Stack Overflow并得到了答案。
经验教训:生成SQL查询的DAO框架魔术在设计上是失败的。 我什至在开始之前就感觉像这样,而我又来了。 也许这一次他们会工作,我对自己说。 不。 您的脑海中有一个干净,快速SQL查询,但是您花了无休止的时间无休止地按摩DAO层,希望它能够正确生成它并且不会太慢。 诸如Android Room之类的东西简直就是优越。
酿酒吗?
业力拒绝与PhantomJS合作
如果我针对PhantomJS浏览器引擎运行,则单元测试将失败。 我会得到类似[object ErrorEvent]
东西,并且测试会随机失败。
经验教训: JavaScript生态系统是一团糟。 但是我已经知道了。
![](https://i-blog.csdnimg.cn/blog_migrate/58eec4af1d4610545c2de03b090cfa37.png)
有组织犯罪如何?
Hoek中的安全漏洞
我不知道Hoek是什么,但是Github抱怨说它存在一个漏洞,所以我花了数小时来弄清楚如何修复它。 该问题已解决,但我不相信已解决。
经验教训: JavaScript是一团糟。 依赖项中的安全性问题始终也是您的问题。
活在桥下,过着社会保障?
角5-> 6
在开发过程中,发布了Angular 6。 我以无限的智慧认为升级应该轻而易举,我只有几百行Angular代码,对吗? 我还以为我会硬着头皮而不使用兼容性层,因为代码库很小。 我运行了自动升级,遇到了...问题。 以下是清单:
- 我大量使用了Observable.of和Rx流运算符,但都没有正确升级。 特别是stream pipe()的更改很痛苦。
- 进口物摆弄着。 我认为他们只是在惹我们。 他们知道这会破坏一切,对吧?
- WebStorm失去了运行测试的能力
经验教训 : 在使用最新和最好的软件时,请格外小心。 如果我只是等待事情解决,也许所有这些都可以避免。
农业?
TypeScript编译错误
突然,Angular一侧的所有组件都崩溃了。 我有:
ERROR in src/app/auth.interceptor.ts(6,2): error TS2345: Argument of type 'typeof AuthInterceptor' is not assignable to parameter of type '({ providedIn: Type<any> | "root"; } & ValueSansProvider)
| ({ providedIn: Type<any> | "root"; } ...'.
Type 'typeof AuthInterceptor' is not assignable to type '{ providedIn: Type<any> | "root"; } & ClassSansProvider'.
Type 'typeof AuthInterceptor' is not assignable to type '{ providedIn: Type<any> | "root"; }'.
Property 'providedIn' is missing in type 'typeof AuthInterceptor'.
Google没有提供任何帮助。 是的,该错误位于auth.interceptor.ts中的第6行,但我没有看到它。 我重写了该类,并比较了结果以找出错误。 我错过了@Injectable注释中的括号。
经验教训:休息后,我立即看到了错误。 检查“ Hello World!”时的基本知识 级别的东西不起作用。
![](https://i-blog.csdnimg.cn/blog_migrate/71660b01b0c33bcacff8eb0dbb24f7a2.gif)
流浪汉?
Kotlin中的Json列表类型
将JSON列表映射到Kotlin Pojos时遇到麻烦。 基本上是这个问题 。 虽然我确实弄清楚了,但它看起来如此丑陋而片状,我选择了计划B,而只是更改了JSON。
经验教训:解决方法始终是一种选择。
公园护林员?
Gradle 4的Spring集成测试
我没有做过Spring Integration测试的运气,我得到的只是:
java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
在我所到之处,一切仍然停留在Gradle 3上,毫无帮助。
获得的经验:您随时可以打开更多搜索选项卡。 无休止的谷歌搜索使我了解正确的魔术:
configurations {
integrationTestImplementation.extendsFrom testImplementation
integrationTestRuntimeOnly.extendsFrom testRuntimeOnly
}
它仍然是魔术。 我什至不知道该读些什么使它变得不可思议。
职业高尔夫球手? 在37岁时仍然可以选择对吧?
我的Rest控制器返回HTML
我的其余端点之一顽固地返回了HTML而不是JSON。 我费力地浏览了注释,无法理解发生了什么。 我添加了各种接受和返回类型注释,但没有任何效果。
我错过了用@Controller而不是正确的@RestController进行注释的类。 叹。
经验教训:再谈基本原则。
施工? 我听说他们有需求。
如果用户没有访问权限,如何返回403
Spring有一个名为UserDetailsService的接口,该接口可用于定义例如如何从数据库中加载用户。 但是我无法弄清楚如何将身份验证与授权区分开,即用户是已知的,但在该页面中是不允许的。 我无处可去 。 我在前端端破解了一个解决方案。
经验教训:失败总是一个选择。
保姆 哦,等等,我已经这样做了。
电脑崩溃
我的旧Surface Pro 3开始承受压力,所以我买了一台新电脑 。 我的单元测试执行时间从15秒减少到2。不再冻结IntelliJ。 我可以在Docker容器中同时运行WebStorm,IDEA和该应用程序,但仍然有可用的内存。
经验教训:解决金钱问题始终是一个好主意,前提是您有钱。
![](https://i-blog.csdnimg.cn/blog_migrate/b4f4f904f37ba63a0ddda787943e8aae.png)
角路径参数
我需要在控制器之间发送参数。 当然,那里有向导 ,但是魔术系数又太高了。 感觉好像偏离了示例一毫米,突然, route.params
空了。 对于业力测试,这是双重事实。 为什么现在不需要此RouterTestingModule呢? 特别是如何为控制器设置参数似乎有很大的不同。 我终于解决了类似这样的问题,将参数传递给控制器:
TestBed. configureTestingModule ({
declarations: [GroupComponent],
imports: [FormsModule, RouterTestingModule. withRoutes ([]), HttpClientTestingModule],
providers: [GroupsService, UserService, AlertService, AuthenticationService,
[GroupComponent, {
provide: ActivatedRoute,
useValue: {snapshot: {params: {'group': '123'}}}
}]]
}). compileComponents ();
这项测试通过每项测试后,您可能会感到很丑陋,但是,它确实有效。
获得的经验:再次具有魔力。 有限的文档流血的边缘魔术。
还有更多,但我想您明白了。
![](https://i-blog.csdnimg.cn/blog_migrate/ab7cf59d4e060461b3803b069305ea57.png)
翻译自: https://hackernoon.com/the-madness-that-is-programming-cba8794f0995
疯狂编程