10.2----10.7收获

10.2

  • 学习完ajax异步调用;
  • 完成添加然后数据库里有数据并且能正常跳转;
  • b站上再看看springboot+mybatis的结合;
  • 总结博客,分别总结分页排序还要mongodb在springboot中的相关操作;

收获

  • springboot启动很慢的原因:未修改host目录的文件,导致每次启动都很慢。

    步骤

在terminal终端输入:

1
$ hostname

复制下来,然后修改host文件中的localhost:

1
$ sudo vim /etc/hosts

然后将自己hostname替换掉localhost

1
2
3
127.0.0.1<两个tab>localhost 替换为$hostname
255.255.255.255<两个tab>broadcasthost
::1<两个tab>localhost 替换为$hostname
  • 在js传值给controller时,一直不能将json数据传过去,原因是没有给data的值加上JSON.stringify()处理,
    具体错误:springboot 接收参数,解析json出现错误:was expecting ‘null’, ‘true’, ‘false’ or NaN
    解决方案:见—->js与controller之间传值常见问题

  • JQuery.ajax
    ajax和springboot传值

  • jquery中字符串转日期,日期转字符串

  • MyBatis主键回填策略

  • 表中部分属性自动生成,不需要额外传入参数

    • 先是尝试了在bean中加@value,加载配置文件中的随机数,但是发现执行一次,随机数是唯一的,这样就不能做到插入一条数据,随机数就变化;
    • 后面发现可以在mybatis直接配置结果集,好像也不行…因为如果你用结果集将id转换为taskId,那原本bean中的id属性就会取不到值…
  • jQuery获取html中的值
    获取html中的值

10.3

收获

使用最大的id!!!
mysql插入数据后返回自增ID的方法(AUTO_INCREMENT)

10.4

收获

  • 复杂json转成多层map
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public  Map<String, Object> parseJSON2Map(@RequestBody String jsonStr){
Map<String, Object> map = new HashMap<String, Object>();
JSONObject json = JSONObject.parseObject(jsonStr);
for(Object k : json.keySet()){
Object v = json.get(k);
if(v instanceof JSONArray){
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
Iterator it = ((JSONArray)v).iterator();
while(it.hasNext()){
Object json2 = it.next();
list.add(parseJSON2Map(json2.toString()));
}
map.put(k.toString(), list);
} else {
map.put(k.toString(), v);
}
}
return map;
}
  • mac强制刷新缓存:command + shift + R
    普通刷新:command + R

Springboot使用多线程

最近遇到一个需求,就是当服务器接到请求并不需要任务执行完成才返回结果,可以立即返回结果,让任务异步的去执行。开始考虑是直接启一个新的线程去执行任务或者把任务提交到一个线程池去执行,这两种方法都是可以的。但是 Spring 这么强大,肯定有什么更简单的方法,就 google 了一下,还真有呢。就是使用 @EnableAsync 和 @Async 这两个注解就 ok 了。
传送门:SpringBoot非官方教程 | 第二十三篇: 异步方法

  • 首先声明一下自己用了比较长的时间才弄出来的原因是,自己把异步方法写到了Controller层,导致在controller的另一个方法调用时无法开启异步功能,所以对此我有三点见解:
    • 在@SpringBootApplication启动类 添加注解@EnableAsync
    • 异步方法使用注解@Async ,返回值为void或者Future
    • 切记一点,异步方法和调用方法一定要 写在不同的类中,如果写在一个类中,是没有效果的,至于为什么—->因为Spring像@Transaction @Async等这些都是使用了动态代理,Spring容器在初始化的时候就会将含有AOP注解的类对象替换为代理对象,再由Proxy对象去调用被增强方法,重点来了:方法里想用增强方法(第三点)则需要得到当前的Proxy对象,但如果是同一个类的话,是不会经过spring容器的,此时是真正的对象本身去调用方法,并不是代理对象,这样的话被增强方法就失效了,详情请看 ->Spring的 AopContext.currentProxy()方法

解决方案

  • 我采用的方案是,将异步方法写入service层,然后再controller层中调用,这样就经过了spring容器,调用方法时就是采用的代理对象。
  • 第二种方法,我没有成功!!!!真的是气的不行,因为我看网上博客别人都成功了……就是用AopContext.currentProxy()这个方法,步骤为:

    • 添加依赖:

      1
      2
      3
      4
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
      </dependency>
    • 在启动类中添加注释

      1
      @EnableAspectJAutoProxy(exposeProxy=true,proxyTargetClass=true)
    • 然后在调用方法处写:

      1
      ((TaskController)AopContext.currentProxy()).testAsy("www.baidu.com");

按理说应该可以了的,结果吧,我一跑程序就报错,说我的哦代理怎么没暴露啊,我真是卧槽了,那他妈不是已经配置了暴露了嘛!!!我服了!!!算了,懒得搭理了…
甩个跟这个原理一样的链接,学习一下:JDK动态代理给Spring事务埋下的坑!
再甩一个链接,三种方法配置这个exposeProxy(然而我一个都没成功…)—->
springboot中如何配置aop动态代理模式 (原创)

Thank you for your accept. mua!
-------------本文结束感谢您的阅读-------------