其实导出Excel不用渲染太多样式的,就分配好适应的长宽比例即可;SQLYog就是这样的
=》想我以前写导出的时候,花了很多时间写代码渲染Excel的样式,这其实都没啥必要,用户下载下来后,自己去调岂不更加方便
close()方法都会抛出一个IOException,所以我们要么写在try里面,要么方法抛出异常,然后代码写在finally里面
map.keySet().containsAll(columnList)
String fileName = "商品信息表"+ System.currentTimeMillis() +".xlsx";
String fileName = "商品信息表" + System.currentTimeMillis() + ".xlsx";
=》两种书写方式比较一下
controller方法形参如果写了一个实体类,即使前台什么也不传递,这个对象也会被默认实例化的
前台调用后台接口导出Excel
注意:这里是不能用ajax的
1.window.location.href = ‘接口地址’
和在浏览器输入接口地址一样,可以下载excel文件.但是缺点是无法执行POST请求
2、利用表单提交,这样就可以做post请求,由于后台返回的信息就是excel数据,所以传到前台就直接变成下载了
Date和Calendar,为什么Date可以直接转化为Calendar
=》参照Excel的setCellValue()方法
链式编程风格
百度云下载慢,只有十几K的时候,我们可以关闭百度云,然后重新打开,这样速度一般都会有改观;
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程,如下所示:
1)继承Thread类创建线程
2)实现Runnable接口创建线程
3)使用Callable和Future创建线程
4)使用线程池例如用Executor框架
一个用户可以创建6个支付宝,但是支付宝里面实名认证一张身份证只能认证3个支付宝
相比较于Thread的匿名构造函数,Runnable传参更加能提现面向对象
常识性问题
=》》》》
多线程机制会提高程序的运行效率吗?
=》由于一个电脑只有一个CPU,所以多线程机制会降低程序的运行效率;
=》例如一个人在一个桌子上做馒头,现在变成了三张桌子,在桌子间徘徊做馒头,效率肯定=是低下来了
为什么会有多线程下载呢?
=》这并不是电脑机器快了,而是抢了服务器的带宽,因为服务器会给一个线程默认的带宽,当你用多线程的时候就会抢占更多的带宽;
但我还是有点疑惑
周一至周五的每天晚上凌晨三点炸,周六周日不炸
=》这样子的话用Timer类没有现成的函数,需要自己封装,但是网上已经有了Quartz开源框架
PS: 所以必须要用同一把锁去挡住所有线程,互斥关键字我还是不理解他的原理怎么用生活场景来描述
不同的斥组
此方法只应由作为此对象监视器的所有者的线程来调用。
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
wait()和notify()方法是属于object的,他们必须在synchronized方法体中使用
=》Thread.currentThread().wait(); 这种写法是错误的
synchronized实现了互斥,也就是说当我一个方法在执行时,必须要全部执行完,才能执行其他方法;
但是他不同步,意思就是这么多方法没有规定的顺序去执行,是随机执行的;
要实现同步,只能靠我们手动添加变量进行判断
如果我不使用wait()能实现同步吗?
=》如果我不用wait(),用mark变量控制其实也可以实现同步,但是速度会慢一些,因为CPU调度可能一直是被主线程拿到,if只是挡住了线程去执行该方法中的代码,而wait()可以让该线程暂停执行,将机会给其他线程
使用wait()时要防止假唤醒,所以要用while替换if
synchronized(obj),wait()是属于obj的方法,所以需要写成obj.wait()
=》例如字节码,ThreadTest2.class.notify();
=》但是由于在synchronized方法体内,所以都可以用this去调用,所以前面wait()方法前的调用者就可以被忽略了
=》一定要注意wait()方法不属于当前线程,不要写成Thread.currentThread().wait(),这样会报错的
在线程内共享,在线程外独立
=》举例:事务问题
=》张三给李四转账时,王五也在给赵六转账,这里双方账户就有转入、转出两个方法,当王五给赵六转账完成时,提交事务,而张三的转账业务只进行了一半,两者共用同一个connection,这是程序就会出问题了;
卧槽,事务的提交是用connection.commit(),我一直以为是用一个事务对象提交
记一次矿机的业务,矿机原先每天的产币是按照矿机类型基础数据表中的来发放的,现在有个问题,我要更换矿机的运行周期和产币数量,之前已经购买的矿机咋办?
=》这个逻辑应该是原先的矿机周期和产币不变,只有后续购买的才发生变化
=》由于时间当时有个创建时间和过期时间,所以周期的话不用担心
=》而矿机收益需要在矿机表里面再加一个矿机总收益字段
=》废弃之前设计的矿机,之前的矿机不显示出来而已,添加新的矿机完成这个功能
ThreadLocal实现线程范围的共享变量
You can't specify target table 'robotactivity' for update in FROM clause
在MySQL中,写SQL语句的时候 ,可能会遇到You can't specify target table '表名' for update in FROM clause这样的错误,它的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中),即不能依据某字段值做判断再来更新某字段的值。
ThreadLocal中存的线程对象,只要还有引用就不会被删除
=》这里是指多个ThreadLocal中都存了同一个线程对象
目前JDK没有提供这种方法--当一个线程死亡时通知某个对象,然后该对象可以做一些事情
多线程访问共享对象时,可以将Runnable对象传入多个线程中,这样就能共享了
run()方法里面的代码只能应用外部的final变量
java5之后增加了线程并发库
Java5的新特性
AtomicInteger
自己写一个tomcat服务器很难,难在性能如何提升
线程不死,程序就不会结束
把任务丢到线程池里,有任务就执行,没任务就等着
关闭线程池
=》Java线程池中shutdown和shutdownNow的区别
固定线程池
缓存线城池,当任务太多应付不过来时,我自己增加线程池中线程的数量
单一线程池(如何实现线程死掉后再重新启动?),他的原理是:死了之后会找一个替补,要死而复生是不可能的
用线程池启动定时器
ScheduledExecutorService有一点瑕疵,他只能使用相对时间,不能用绝对时间,如果你要制定绝对时间--可以换一种思路,用绝对时间减去目前时间剩下的相对时间就可以了;
线程池
void execute()
Future submit()
CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象。
=》好比是我同时种了几块地的麦子,然后就等待收割。收割时,则是哪块先成熟了,则先去收割哪块麦子。
Lock比synchronized更加面向对象
Return on investment
投资回报率
我在定时任务的最后一段写了一句话,在那里打了断点,我原以为当我将程序中断后,事务会回滚,竟然没想到数据库还是插入成功了;
程序运行时如果抛出异常,但是被捕获掉了,那么就不会进行事务回滚了
本机的时间或许和服务器时间不同,这样依赖定时任务的判断就没有效果了
本机10点14,服务器是10点05
Java多线程并发课程中的18--阻塞队列和19--同步集合类,我就不练习了
为什么多线程执行一个方法会比一个线程执行要快,以前我总有点懵懂,现在我完全懂了,因为本机上有一个CPU,CPU要调度多个程序,如QQ音乐,谷歌浏览器,这些程序运行都产生了很多线程,原来你程序调用只有一个线程,那么当你走的时候,CPU可能会切换到其他的非本程序线程,当你开启多线程后,他们会抢占CPU资源,与QQ音乐、谷歌浏览器等竞争,因此有更多的时间来执行本程序;
=》但是关于线程切换消耗的时间是怎样的,我不了解
thread.join的含义是当前线程需要等待previousThread线程终止之后才从thread.join返回。简单来说,就是线程没有执行完之前,会一直阻塞在join方法处。
在匿名构造函数中,只要变量不重新赋值就行,并非外部变量一定要定义成final常量
ReadWriteLock 如何分辨线程是进行读操作还是写操作
=》读和写只是两个定义,是两把不同的锁,是为了实现读写不互斥而使用的
=》不对,还是有问题
"1"都是常量,这个常量写多少次都是同一个对象;
但是相加/new之后就不是同一个对象了;
有个面试题:
String a = "1" + "";
String b = "1" + "";
a与b是否相等,答案是相等,这是因为编译器给它做了优化,但是如果你是变量形式的相加(String a = key + key2);这种编译器就无法做优化了;
Exception in thread "Thread-1" java.util.ConcurrentModificationException
https://docs.oracle.com/javase/7/docs/
两个 Long 类型为什么不能直接用==比较
=》有时会报错,没找到例子证明
log4j是通过一个.properties的文件作为主配置文件的,而现在的log4j 2则已经弃用了这种方式,采用的是.xml,.json或者.jsn这种方式来做,可能这也是技术发展的一个必然性,毕竟properties文件的可阅读性真的是有点差。
The method's class, org.apache.logging.log4j.Logger, is available from the following locations:
Correct the classpath of your application so that it contains a single, compatible version of org.apache.logging.log4j.Logger
=》log4j的jar包版本冲突,有多个这种jar包
springboot默认采用的logback,也挺好用的,就不额外集成log4j了
=》把日志级别改成DEBUG你会发现启动的时候回比INFO多处很多内容,很对小错误都会抛出来
=》Mybatis的日志如果要打印,需要把日志级别改成DEBUG;正常的做法是只针对于mybatis相关文件夹设置为DEBUG,其他文件夹设置为INFO
如果日志文件的名字定义成logback-spring.xml,则不需要在application.yml中进行配置,否则需要配置如下语句:
logging.config=classpath:logging-config.xml
如何解决添加了logback配置文件,仍然无法打印mybatis日志
=》由于我们的日志级别设置的是INFO,所以我们需要对mybatis放开特权,在logback配置文件中添加
=》这里要注意,在网上有的人说填写dao层的位置,他们填写的都是具体的某个dao,我试过中间用*号代替,想让所有的dao层都设置DEBUG级别,但是发现没用,或许这里不能用匹配符,所以我用的顶级路径
=》用顶级路径的具体改变是什么我不是很明确,反正不会出现像开启整个DEBUG级别那么多的错误咯
disabled为形容词,所以在字段命名时不用加is
而delete、buy、display都是动词,因此在字段命名时加上is,变成isDelete、isBuy、isDisplay
至于被动的概念,例如是否被删除,按理来说应该加上ed,变成isDeleted
=》我看了下应该是isDeleted,其他人写的isDelete是错误的
为了代替IsDeleted标志,Dahan建议用一个代表相关数据状态的字段:有效、停用、取消、弃置等等。用户可以借助这样一个状态字段回顾过去的数据,作为决策的依据。
删除数据除了破坏数据一致性,还有其它负面的后果。Dahan建议把所有数据都留在数据库里:“别删除。就是别删除。”
=》这个字段命名和注释不要太纠结,否则会犯纠结症的
废弃tinyint(1),状态统一用int(1),因为tinyint不明显
Everything up-to-date
=》git push 的提示,所有文件都是最新的
记一次台式电脑没网显示感叹号win10的问题
早上到办公室还上过网页,过了半个小时就不行了
我排除了网线的问题,因为同一个办公室用的一个转接器,只有我一个人没网,我的网线插入到其他主机上就有网了
按照网上描述用在以太网那里点击诊断后发现是“以太网2没有有效的ip配置”
=》网上有三种办法,
其一是手动更改ip,
其二是自动获取ip,在服务中开启wire auto config 和 wlan auto config两个选项,并将他们设为自动启动,然后禁用以太网2,然后重新启动以太网2,接着输入以管理员方式运行两个命令:
net int ip reset(这个命令有点博客没有记录)
netsh winsock reset
然后重启服务器(一定要在以太网启动的时候运行这两个命令,否则有些配置不会被修改)
其三是说DHCP服务器的原因,让我输入ipconfig/release 和 ipconfig/renew来重新获取IP(但是我输入命令后似乎提示VPN未连接,无法运行该命令)
==》反正上面三种方法我都试过了,问题还是没解决,于是我打算中午找同事帮忙看下,如果不行就重启下路由器。然后就看本地视频了,觉得感叹号图标看着难受,就把以太网禁用了,后面好像整个办公司断过一次网,然后我中午启用以太网就OK了;
=》有点奇怪哦,我的分析就是,导致这个ip配置无效的原因就是这几天办公室频繁断网,导致路由器分配ip异常,解决方案应该就是重新启动路由器,让他重新分配一次IP地址;
注意我们在mapper中定义的 getListByPage方法,他的返回值类型是 List<Map<String, Object>>,但是实际开发时,List中的对象类型取决于mapper的resultMap返回什么类型,我们写的是resultType是POJO类,所以你调试会发现List里面装的是POJO;
=》但是很奇怪的一件事情,为啥程序不会报错?pojo->Map
$('#tab1-li').click();
$('#tab1-li').trigger("click");
都可以用于手动触发click事件
为未来元素做绑定,window和body都可以--充当父级元素,记住on的参数顺序,事件名称放第一位,元素名称放第二位,函数放第三位
$(window).on("click",".user-addresslist", function() {
$(this).addClass("defaultAddr").siblings().removeClass("defaultAddr");
});
获取带有两个类样式的li元素,要这样写
$("li.user-addresslist.defaultAddr").length
这种写法错误,都要紧挨着,不需要用空格隔开
$("li .user-addresslist.defaultAddr").length
BigDecimal 默认是52位精度
0E-52
如果使用除法的话,有可能会出现算术异常,需要四舍五入
eclipse 找不到自己的类 java
=》是由于web library没有配置
=》改了之后还是报错,是你没有刷新文件,当前已打开的文件需要关闭再打开
我终于知道sourcetree怎么配置多个git账户和密码了,让我想到了这种问题的解决办法
=》账号密码都是在配置文件中写好的,只要找到配置文件就OK了,至于能否配置多个账户和密码,有些软件或许不行,但是关于git的肯定是行的
自动我git自带cmd窗口清空账户名和密码后,我每次访问项目都需要输入用户名和密码,不知道是否能配置多个账户;
=》sourceTree和他是独立的,他的工作机制应该是先用git的账户信息去检测,然后再使用自己的账户信息去检测
js文件里面不用写script,写了会报错
hbuilder中和html放在一起的script如果颜色不正常,那么一定是html元素出了问题,我们依据颜色异常的开始行进行问题定位
WPS为什么有的元素就是不能垂直居中
=》是因为单元格对其方式没有设置,选中单元格,鼠标右击
v1.1.3
注释用楷体11,正文用宋体12
=》恰到好处
WPS列调节宽度,一旦与其他行对上了,那么便会一起走
=》如何不让他们一起走呢?
wps如何很好的插入代码
=》只需要先插入1×1的表格
=》把带有高亮的代码粘贴到里面
=》可以设置项目符号和编号,这样就能显示行号了,如果这样设置了,那么所有的代码会自动水平靠左,当你取消项目符号和编号他们会回到原来的格式
Git删除分支/恢复分支
git reflog
=》查看你上一次 commit SHA1值,这个SHA1值就是HEAD...
git branch master_website_feedback HEAD@{28}
=》恢复分支,你打开sourcetree就可以看到了
为什么CommonController中的方法可以访问,而BaseAction中的方法可以访问
=》是因为CommonController类中用的@Controller注解,非@RestController注解,又没有在方法上加@ResponseBody注解,导致此方法不能返回JSON数据,因此报404错误
QQ转发的文件会被自动重命名
所谓的插件其实就是一个jar包,idea选择本地插件路径时在桌面上可能看不到你的文件夹,这时你需要直接定位到jar包的上一层文件夹路径
=》这样就会看到了
springboot集成activiti
问题一:Caused by: java.lang.ArrayStoreException:sun.reflect.annotation.TypeNotPresentExceptionProxy
解决办法:项目一启动就报这个错误,折腾了很久都没有解决这个问题,最后在一篇博客上找到解决办法,但是遗憾的是忘记了作者的博客链接。解决办法是直接在启动类上加上 @SpringBootApplication(exclude = SecurityAutoConfiguration.class) 即可。SecurityAutoConfiguration.class来自于类 org.activiti.spring.boot.SecurityAutoConfiguration。第一次我引错了类,导致该问题无法解决。我还认为我的错误不是用这个方法解决。哎,小心仔细啊。
springboot整合activiti时,启动抛异常
nested exception is java.io.FileNotFoundException: class path resource [processes/] cannot be resolved to URL because it does not exist。处理方法
(1)在resource目录下添加processes文件夹,并且文件夹不能为空
(2)在application.properties下家配置
#启动报错class path resource [processes/] cannot be resolved to URL because it does not exist
spring.activiti.check-process-definitions=false
1
2
启动时不检查流程文件
Found MySQL: majorVersion=5 minorVersion=7
assignee
代理人;受托人;分配到任务的人
org.activiti.bpmn.exceptions.XMLException: Invalid byte 2 of 3-byte UTF-8 sequence.
Caused by: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 51; Invalid byte 2 of 3-byte UTF-8 sequence.
Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 2 of 3-byte UTF-8 sequence.
遇到这个问题不要慌,他就是xml出现了乱码
org.apache.ibatis.exceptions.PersistenceException:
Error updating database. Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (13,574 > 1,024). You can change this value on the server by setting the 'max_allowed_packet' variable.
=》今天处理数据时因为一个字段中的文字太多了导致没办法将数据插入到数据库中,记录下解决办法
service mysqld restart
可能无法重启mysql,用另外一种办法
service mysql restart
流程部署时不用我设置图片,只要设置了bpmn文件,数据库会自动添加图片的
mysql报错 Communications link failure during rollback(). Transaction resolution unknown.解决方式
SET GLOBAL wait_timeout = 280000;
我不知道是不是这个配置生效了,我看mysql的配置,这个时间是没有改变的
任务表里面可以看到一个流程实例ID、一个执行实例ID
这两者的值是一样的,因为我们这里是单线流程
任务在RU里面存的时候,在hi里面也会存一份
ru_task 只会存放正在执行的任务
SELECT CONCAT('DROP TABLE IF EXISTS ', table_name, ';')
FROM information_schema.tables
WHERE table_schema = 'leave_db';
=》导入excel中复制出来
RepositoryService
SELECT * FROM ACT_GE_BYTEARRAY; #二进制文件表
SELECT * FROM ACT_GE_DEPLOYMENT; #流程部署表
SELECT * FROM ACT_GE_PROCDEF; #流程定义表
SELECT * FROM ACT_GE_PROPERTY; #工作流的ID算法和版本信息表
RuntimeService TaskService
SELECT * FROM ACT_RU_EXECUTION; #流程启动一次只要没有执行完,就会有一条数据
SELECT * FROM ACT_RU_TASK; #可能有多条数据
SELECT * FROM ACT_RU_VARIABLE; #记录流程运行时的流程变量
SELECT * FROM ACT_RU_IDENTITYLINK; #存放流程办理人的信息
HistroyService
SELECT * FROM ACT_HI_PROCINST; #历史流程实例
SELECT * FROM ACT_HI_TASKINST; #历史任务实例
SELECT * FROM ACT_HI_ACTINST; #历史活动节点表
SELECT * FROM ACT_HI_VARINST; #历史流程变量表
SELECT * FROM ACT_HI_IDENTITYLINK; #历史办理人表
SELECT * FROM ACT_HI_COMMENT; #批注表
SELECT * FROM ACT_HI_ATTACHMENT; #附件表
IdentityService
SELECT * FROM ACT_ID_GROUP; #角色
SELECT * FROM ACT_ID_MEMBERSHIP; #用户和角色之间的关系
SELECT * FROM ACT_ID_INFO; #用户的详细信息
SELECT * FROM ACT_ID_USER; #用户表
部署的第二种方式
=》将bpmn、png文件打成压缩包,进行部署
BigDecimal的equals慎用,其他包装类的也是
=》用compareTo()去比较
流程部署后,如果多次启动流程,会有多条流程实例记录,但是版本号不一样
=》如果以key去启动,启动的会是最后一次部署的流程
他的这些表里面建立了外键约束
activiti Invalid query: call asc() or desc() after using orderByXX()
请假单id,businesskey
varinst 与 variable 都是变量的意思,有啥区别,activiti的运行表中用的是varible,历史表中用的是varinst
用户表拆分,用户、商业节点、企业用户应该拆分为三张表,堆在一起通过type区分会造成接口混乱的,比如修改密码、登录等操作,全部都要通过type进行区分,一有遗漏,就会出问题
int type = Quantity.INT_1;
在分支上如果有多个独立的问题需要修改,那么我就针对于独立的分支新建很多个分支
@Autowired
private MemberService memberService =new MemberService();
或
@Autowired
private MemberService memberService;
//查询出所有 参与的用户
int isjoin = Quantity.INT_1;
List<Member> memberList = memberService.selectByIsJoin(isjoin);
将这个selectByIsJoin写在Controller类的花括号中,系统启动失败
=》不能这样写吗,一定要写在方法体内??
show VARIABLES like '%max_allowed_packet%';
set global max_allowed_packet = 2102410;
分支:既可以走A路线,又可以走B路线
=》不叫分支,叫选择
上传到服务器好快,但是从服务器上面下载下来好慢
很多人说:“成年之后的安全感,绝大部分来自于你银行卡上的存款数。”而很多人盯着自己银行卡上的那串数字,总希望能够一夜之间能多那么几个零。
这种焦虑急切的心态可能会转化为你不断努力存钱的动力,但也有可能一不小心就带你进入了一个死循环:提前对自己设定过高的期望值,没能实现时就自怨自艾,仿佛一直都在跟自己较劲,却总没有做出什么实质性的改变。
很多人都急,但你不要急。有多少能力就有多少存款。面对这个问题,你要么就安安心心,在这个水平里把自己的小日子过好;要么就使点劲,让自己的能力配得起多一点的存款,哪怕多一点点呢,跟别人比起来不算什么,但跟自己比起来,已经是跨越了。
deploymentNameLike() 报错
Could not write JSON: (was java.lang.NullPointerException); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.paintingstone.common.bean.BasicData["data"]->com.github.pagehelper.PageInfo["list"]->java.util.ArrayList[0]->org.activiti.engine.impl.persistence.entity.DeploymentEntityImpl["resources"])
目前的解决办法是自定义一个类替换掉DeploymentEntityImpl
deploymentName() 不报错
模糊查询的感觉
PageHelper分页的底层
执行startPage()方法后,我写了多个list查询,这些list查询都会被分页
ACT_RU_JOB
ACT_RU_TIMER_JOB
这两张表隔几秒就在查询数据
activiti升级做了一些改动
repositoryService.createProcessDefinitionQuery().deploymentIds(deploymentIdSet).list();
这个方法,如果set集合没有数据,那么activiti会把所有的流程定义信息查询出来,而之前的版本会直接报错
controller进行多个service业务的整合
return repositoryService.getResourceAsStream(deploymentId, resourceName); //这种方法读取出来的输入流有问题,ImageIO根本就读取不到图片信息,我直接生成的图片文件打开也是一片空白
得用这种方式:
return repositoryService.getProcessDiagram(processDefinition.getId());
只要改变了输出流的MIME类型,如JPEG,管你返回值是什么,前端接收的接口返回值都是图片
=》所以我们再写浏览图片、导出Excel时返回值都为void
=》但是如此一来就是错误信息不好抛出来,就只能通过抛出异常信息了
=》这种接口一般需要定义为GET请求,因为前端不会发起ajax请求,就一个href链接过去了
activiti自动生成的图片很丑,难道真需要自己截张图吗???
LeaveBill.class.getSimpleName();
=》获取类名
[Validation set: 'activiti-executable-process' | Problem: 'activiti-usertask-listener-implementation-missing'] : Element 'class' or 'expression' is mandatory on executionListener - [Extra info : processDefinitionId = LeaveBill | processDefinitionName = LeaveBill_name | | id = _4 | | activityName = apply for leave | ] ( line: 6, column: 104)
配置监听器,如果没有指定类,部署的时候就会报错的
部署的时候报流程定义id为空
=》未找到原因,我重新用test方式部署了一下,可以部署
通过zip压缩包上传部署,只在deploymen这张表里面插入了数据,其他流程定义表等等都没有数据
通过test方式部署完全ok
如果数据库操作得比较频繁,而你的网络又比较卡,那么你可能会连接超时
=》这时你需要重启下mysql的服务
个人任务页面的办理任务按钮会弹出一个窗口
=》窗口包含请假单信息、历史批注信息、连线信息-按钮
mysql修改全局变量,一天后自动失效是怎么回事???
在监听器/拦截器中怎么拿到当前登陆的用户,除开session这种方式
=》用上下文的方式去获取
前端的查看流程图是怎么实现的,就是需要后台返回当前任务在流程图中的坐标,四个方位的坐标拿到了,前台一个div就可以渲染出来了
这个通过请假单id查询批注信息, 查询审批记录--hi_taskinst我就不写了
这个查看流程图获取四个方位图标我也不写了,因为写了这么多,主题流程已经可以走通了,这两个东西也很简单,不想写了
先添加facets,再添加artifacts
电子保函这个ISysAccountService类找不到的问题,通过clean project解决
然后又报了一个E:/temp文件夹找不到问题,创建一个就行了
用idea启动项目报的哪个application-...-connection.xml文件解析错误的那个问题,在我配置好eclipse,让项目能在eclipse中能启动后,竟然自动修复了,哈哈哈
=》有些问题真tm是环境导致的,子虚乌有
idea下面tomcat运行了,但是访问tomcat页面访问不了,项目页面可以出来,是因为idea将tomcat引用的一份其他的地址。可能是这样啊...
需要将library添加到modules
傻逼了,终于把swagger给弄出来了,这个项目是真的坑
=》首先要确定的是,我还是不明白为啥我的springboot项目不需要下载swagger的dist目录放到项目中,而现在的springmvc必须得这样做
=》其次昨天晚上为什么页面一直出不来呢,因为我们的框架规定了静态资源必须放到public目录下
=》然后就是为啥网上有人在spring-mvc配置文件中添加内容,那是因为他们想指定swagger-ui.html就可以访问到dist目录下的index.html页面
=》还有就是要将Swagger2Config文件放在spring会扫描的地方,我昨天是放在了extend/config下面,那是不行的,我今天放在sso/controller下面就可以了。如果不放正确,swagger页面就获取不到接口信息。我就在spring-...-extends.xml文件中定义Swagger2Config类的bean对象也不行,因为真正需要的是这个类上面的注解需要被扫描
swagger有种配置更加灵活,不需要指定具体的扫描包路径,他可以扫描所有有注解的API
原本Swagger2Config中的以下代码会出错,一直报com.google.common.base.Predicates;类找不到,加了guava.jar后就可以了
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
没加guava.jar之前,我把上面那段代码注释掉了,后面又产生了一系列的google包找不到,就添加了guava.jar
=》上面那个类,在特定包google-common.jar中也有,但是guava.jar包含了大部分常用的google包
=》最后我只想说集成swagger,非maven项目需要引入的jar包是真tm的多
index.html中的那段js代码该不该无所谓
如果在Swagger2Config中不去扫描api,那么swagger会扫描整个项目,展示出一些乱起八糟的Controller
这几段代码我试了下没用,我只能通过写接口达到同样的目的了
<!--配置swagger信息-->
<!--<bean class="com.jinghao.extend.conf.Swagger2Config"/>-->
<!--<mvc:resources mapping="swagger-ui.html" location="/public/swagger/index.html" />-->
如果springmvc指定了页面跳转的前缀和后缀,我们可以通过重定向来跳转到我们想进去的页面,因为springmvc指定的可能仅仅是转发
return "redirect:public/swagger/index.html";
在使用重定向/转发的时候Controller类要用@Controller注解,不能用@RestController注解,否则不会跳转,浏览器会显示一段字符串
使用这种配置方式,swagger页面的controller的标签和描述都出不来,展示的是将类名按照驼峰拆分
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
使用这种方式就可以出来,但是查询出来的还包括所有的controller,里面参杂了很多没见过的接口
.apis(RequestHandlerSelectors.basePackage("com.jinghao"))
=》如果用扫描包路径这种方式,就算没加swagger注解的接口,都会被展示出来
醉了,swagger这个问题我是解决不了了,先就这样用着吧
=》初步判定是没有扫描@Api注解,在Swagger2Config类中只配置扫描了@ApiOperation注解