记一次springboot开发中所遇到的坑和解决方法

于风‘sblog      2022-05-03     423

关键词:

 

记一次SpringBoot 开发中所遇到的坑和解决方法

mybatis返回Integer为0,自动转型包空指针异常

当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Integer便为null,这时候将Interger自动转型为int,则会出现空指针异常

这个时候,我们可以在Service层对Integer的数据进行判断,如果为空,就把它复制为0

// 在pojo中,如果Integer canJoinNun为null 就把值设置为0
if (publishMsg.getCanJoinNum() == null) {
    publishMsg.setCanJoinNum(0);
}

关于开启druid的监控界面

maven包的引入:

 <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
</dependency>
<!-- 要引入log4j,不然druid会报错 -->
<dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
</dependency>

配置文件

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useAffectedRows=true&allowMultiQueries=true
    username: # 账号
    password: # 密码
    driver-class-name: com.mysql.cj.jdbc.Driver
    platform: mysql
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      # 下面为连接池的补充设置,应用到上面所有数据源中
      # 初始化大小,最小,最大
      initialSize: 1
      minIdle: 3
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 30000
      validationQuery: select ‘x‘
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
  #    pool-prepared-statements: true
  #    max-open-prepared-statements: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,‘wall‘用于防火墙
      filters: stat,wall,log4j
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
        # 配置DruidStatFilter
      web-stat-filter:
        enabled: true
        url-pattern: "/*"
        exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
      # 配置DruidStatViewServlet
      stat-view-servlet:
        enabled: true
        url-pattern: "/druid/*"
        # IP白名单(没有配置或者为空,则允许所有访问)
        #          allow: ****
        # IP黑名单 (存在共同时,deny优先于allow)
        #          deny: ****
        #  禁用HTML页面上的“Reset All”功能
        reset-enable: false
        # 登录名
        login-username: admin
        # 登录密码
        login-password: 123456

向mysql插入中文字符串,插入成功之后数据显示==?==

  这个问题有点奇葩,我在本地的manjaro环境中进行开发,插入中文字符串没有问题,但是当我把springboot应用部署到Ubuntu服务器上时,便出现插入中文字符串,最后却显示==?==的情况。

  解决方法:在jdbc的链接后面加上==characterEncoding=utf8==即可

  ```yaml
  jdbc:mysql://localhost:3306/sign_up?useAffectedRows=true&allowMultiQueries=true&characterEncoding=utf8
  ```

  不过,还是不懂为什么在本地不加==characterEncoding=utf8==也没问题。

关于跳转的问题

  场景:此时我有一个==xxx.com==的域名,我用nginx做代理,将==xxx.com/project_A/**==的请求转到springboot的==project_A==项目中。这时候我们不可能在每一个路由RequestMapping中,前面都加上一个==project_A==吧。

  nginx的配置:

  ```properties
  server {
      listen 80;
      server_name xxx.com;
      root /usr/tomcat/webapps;
      charset utf-8;
      location /project_A {
      proxy_pass http://127.0.0.1:8080/project_A;
      proxy_cookie_path /project_A /;
  
   }
  }
  ```

  这时候,nginx便会将所有的以==xxx.com/project_A/==转到project_A的项目中。

  那么在前端的thymeleaf中,应该怎么修改呢?

  css引用:使用==th:href="@{……}"==

  ```html
  <link rel="stylesheet" th:href="@{/static/css/detail.css}" type="text/css">
  ```

  js引用:使用==th:src="@{……}"==

  ```html
  <script th:src="@{/static/dist/js/bootstrapValidator.min.js}"></script>
  ```

  在ajax请求中,请求路由的写法:

  ```html
  <script type="text/javascript" th:inline="javascript">
      /*<![CDATA[*/
  	$.ajax({
  		url: /*[[@{/publish/getContent}]]*/,
  		async: false,
  		data: form.serialize(),
  		complete: function (msg) {
  			console.log("完成!");
  		},
  		success: function (result) {
  			console.log(result);	
  		}
  	})
      /*]]>*/
  </script>
  ```

  > Tips: js内联代码中需要加入/*<![CDATA[*/    ......    /*]]>*/代码块,thymeleaf才能正确解析一些运算符(<等)和操作符号&/&&等。

  当我们这样使用的时候,他就能够在模板解析的时候自动将==project_A==,加载在引用的前面。例如:前面的css引用解析的时候就会变成

  ```html
  <link rel="stylesheet" href="project_A/static/css/detail.css" type="text/css">
  ```

  在后端的RequestMapping中,并不需要去修改里面的值,甚至说,`return "redirect:/page/index"`都不需要去修改。但是,却有一个奇葩,那就是在拦截器中的那个重定向:

  因为在拦截器中,我们只能够return true或者false,所以我们进行重定向就得使用response.sendRedirect进行重定向,如果我们这样使用,那么它进行重定向就会重定向到==xxx.com/login/index==去,而不是==xxx.com/project_A/login/index==

  ```java
  response.sendRedirect("/login/index");
  ```

  所以我们不得不更改为`response.sendRedirect("/project_A/login/index");`

  不过我总感觉应该会有其他方法去解决这个问题,因为这样做的话,一旦更改,就必须得重新改代码或者文件。如果有的话,可以在评论区留言,谢谢。

      5. 数据库的时间问题

    在mybatis中,向数据库插入时间直接使用==java.util.Date==即可。

springboot mybatis下划线转驼峰

  本来以为能够自己转的,然后发现自己想多了,╮(╯▽╰)╭

  ```yaml
  mybatis:
    #  mapper的位置
    mapper-locations: classpath:mapper/*.xml
    configuration:
      # 开启下划线转驼峰
      map-underscore-to-camel-case: true
  ```

Springboot MySql分页AOP

  场景:有多个网页,但是每个网页的每一页都只显示数据库的10条数据,这个时候我们便需要进行分页。但是如果每次去select数据是,都去写一次分页,这毫无疑问,是一个重复的劳动力。OK,既然OOP是重复的劳动力,那么我们便使用AOP吧。

  maven引入

  ```xml
    <!-- Mybatis分页依赖-->
          <dependency>
              <groupId>com.github.pagehelper</groupId>
              <artifactId>pagehelper-spring-boot-starter</artifactId>
              <version>1.2.10</version>
          </dependency>
          <!--springboot的AOP-->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-aop</artifactId>
          </dependency>
  
  ```

  MyService获得数据里面的数据

  ```java
      // Mapper
  	@Autowired
      private GetMsgMapper getMsgMapper;
  
  	@Override
      public Object getJoinMsgsWithPage(Integer page, String id) {
          return getMsgMapper.getJoinMsgs(id);
      }
  
  ```

  切面的写法

  ```java
  @Component 	// 注入到IOC容器里面
  @Aspect		//是之成为切面类
  public class PageSql {
  
      // 定义每页拿出多少数据
      public static final Integer PAGE_NUM = 10;
      
      // 切入的点 切com.xxx.service.serviceImpl包下所有类中以WithPage结尾的方法
      @Pointcut("execution(public * com.xxx.service.serviceImpl.*.*WithPage(..))")
      public void serviceFindFunction() {
      }
  
      @Around("serviceFindFunction()")
      public Object serviceImplAop(ProceedingJoinPoint point) throws Throwable {
          // 获得切入点的参数
          Object[] args = point.getArgs();
          // 在我的使用中,第一个参数是page,也就是取第几页的数据
          PageHelper.startPage((Integer) args[0], PAGE_NUM);
        	// 执行原来的方法得到数据
          Object object = point.proceed(args);
          // 假如拿到的数据是List的这种类型,则就进行分页,否则就直接返回
          if (object instanceof List) {
              List objList = (List) object;
              PageInfo pageInfo = new PageInfo<>(objList);
              return pageInfo;
          }
          return object;
      }
  }
  
  ```

  这样,当我们在Controller里面去调用的时候就很爽了

  调用示例:

  ```java
  PageInfo pageInfo = (PageInfo)MyService.getJoinMsgsWithPage(1, "8888");
  ```

  在这里面,返回的pageInfo就是已经经过分页的数据了。

自己蠢了的地方 404 NOT FOUND

  在将springboot项目部署到服务器上面的时候,刚开始只想试试能不能够部署成功,然后就暂时没有将本地的数据库部署上去。再然后,就陷入了为啥本地能运行而远端不能运行的死循环了。到后面才发现,因为无法链接数据库,project都没有启动。╮(╯▽╰)╭

 

技术图片
img

 

常见的移动端h5页面开发遇到的坑和解决办法(代码片段)

转自:https://www.cnblogs.com/LiuJL/p/7744473.html1、安卓浏览器看背景图片,有些设备会模糊。 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果... 查看详情

使用mysqlinnodb使用5.7的json类型遇到的坑和解决办法

----------------------------------------------#查询JSON的某个字段selectdata->‘$.Host‘fromtemp#创建虚拟列ALTERTABLEtempADDhostvarchar(128)GENERATEDALWAYSAS(json_extract(data,‘$.Host‘))VIRTUAL;#给虚拟列创建索引ALTERTABL 查看详情

记一次解密的坑

做项目遇到请求对方页面,对方返回的参数串直接拼接到我的URL上,是一个加密串.因为忘记了之前有URLEncoder这个步骤,解密的时候没有使用URLDecoder进行解密,直接使用AES解密遇到报错,Inputlengthmustbemultipleof16whendecryptingwithpad还可能报Il... 查看详情

记一次storm提交任务遇到的坑(代码片段)

摘要:主要是自己没有真正理解stormjar命令参数的意义。 情景复现:  在storm集群中使用命令提交后,在UI界面中,一直看不见任务提交上来的任务,但是在集群提交的shell界面中,是可以看到相关任务的日志输出情况的。 ... 查看详情

常见的移动端h5页面开发遇到的坑和解决办法(代码片段)

转过来,平时看看。虽然还有很多问题至今无解。比如:华为麒麟950的P8和meta打开我们的应用首页经常偶发白屏。!!1、安卓浏览器看背景图片,有些设备会模糊。 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原... 查看详情

记一次若依微服务版mybatis升级mybatis-plus之后遇到的坑

参考技术A错误:mybatis升级mp后启动报错:经过大佬 AbstractCulture的在线指导,在debug模式下源码逐步执行之后发现问题出在mp解析xml文件的时候出现错误,没加载到自己的bean 查看详情

记一次ffmpeg的编译过程的坑

参考技术A参考文章:iOS开发-超详细集成FFmpeg步骤         iOS集成FFmpeg及视频格式转码以下是在编译过程遇到的问题:1.编译出现以下错误信息.xcrun-sdkiphoneosclangisunabletocreateanexecutablefile.Ccompilertestfailed... 查看详情

记一次升级springboot版本遇到的问题.

参考技术A因SpringBoot版本太老,升级到较新的版本.2.0.8.RELEASE->2.4.7思路:直接升级springboot版本号,然后解决依赖报错问题,找不到类,方法等问题.走一步看一步.可能的原因有三个:更改为并新增了改为使用静态方法by之后,正常运行.改... 查看详情

记一次学习kibaba踩过的坑(windows环境)

下载地址ElasticSearch:https://www.elastic.co/cn/downloads/elasticsearchLogstash:https://www.elastic.co/cn/downloads/logstashKibana:https://www.elastic.co/cn/downloads/kibana安装Kibana的过程中遇到这样的问题   查看详情

在技术胖博客上学习es6遇到的坑和想法

第一节:ES6的开发环境搭建坑1:全局安装babel-cli已经不被官方推荐,改为局部安装(cnpminstallbabel-cli--save-dev);坑2:babelsrc/index.js-odist/index.js命令失效,可以直接跳过这一步。 想法相对于来说,这是一个挺好的入门的教程... 查看详情

记一次项目上线后log4j2不输出日志的坑(代码片段)

   公司项目采用了Log4j2来输出日志,在开发环境和测试环境下均可以输出日志,但在生成环境就没有日志输出。开始毫无头绪,后来通过不断的排查,终于解决了这个问题。在此记录下该问题的解决过程,便于后续查... 查看详情

百川解码精彩回顾:热修复的坑和阿里的解

热修复是很多开发者关心的技术,8月27日晚,阿里百川组织了“百川解码”在线直播,以“热修复的坑和阿里的解”为主题,邀请了三位业界嘉宾对热修复技术进行了探讨,并介绍了阿里百川全面接受公测的热修复解决方案:阿... 查看详情

记一次虚拟机无法访问主机的坑

  因为客户方使用的浏览器都是IE8的版本,所以在每次开发完功能之后都需要用IE来测试,IE最高系统只能在XP中运行,所以这次我和往常一样装了虚拟机,装了XP,网络模式使用NAT,在虚拟机中访问主机的jboss服务一直访问不... 查看详情

记一次springboot搭建过程(代码片段)

遇到的问题如下:1.SpringBoot正常启动后,访问Controller报404问题描述:springboot正常启动,通过http://localhost:8000/hello/first访问,一直报404原因:在搭建完项目之后,Application类是放在com.example.hello的包下面,而Controller类是放置在com.e... 查看详情

记一次开发过程中,iview遇到的一些坑以及解决办法(代码片段)

写在开头:本次项目采用的是vue2.0+iview3.0,最近公司没啥事,来总结一下开发过程中遇到的问题。 1、Modal关闭问题需求背景:modal框里面是个form表单,点击确定之后,先验证form表单,验证通过则关闭modal框,验证不成功则提... 查看详情

记一次cephfs插件(csi)使用的坑

参考技术A部署了csi插件后,调整configmap配置(csi-config-map-sample.yaml);创建secret(注意指定ceph集群的明文信息),然后部署storageclass,最后创建pvc测试使用3.在虚机上压测ceph性能,read达到200M(损耗三分之一)4.在pod上压测ceph性能,read仅能... 查看详情

记录一次springboot中遇到的下载pom文件失败的坑(备忘)

不知道怎么个情况,bootRun突然给报了个错,提示:  bootRunFAILED  FAILURE:Buildfailedwithanexception.懵逼,前一秒还好好的,咋后一秒就不行了呢,由于没有详细日志,遂使用命令行执行gradlebuild--debug看了下详细的出错信息,经过... 查看详情

记一次拿webshell踩过的坑(如何用php编写一个不包含数字和字母的后门)(代码片段)

0x01前言最近在做代码审计的工作中遇到了一个难题,题目描述如下:<?phpinclude‘flag.php‘;if(isset($_GET[‘code‘]))$code=$_GET[‘code‘];if(strlen($code)>40)die("Long.");if(preg_match("/[A-Za-z0-9]+/",$code))die("NO.");@eval($ 查看详情