記一次SpringBoot 開發中所遇到的坑和解決方法

記一次SpringBoot 開發中所遇到的坑和解決方法

mybatis返回Integer爲0,自動轉型出現空指針異常

當咱們使用Integer去接受數據庫中表的數據,若是返回的數據中爲0,那麼Integer便爲null,這時候將Interger自動轉型爲int,則會出現空指針異常javascript

這個時候,咱們能夠在Service層對Integer的數據進行判斷,若是爲空,就把它賦值爲0css

// 在pojo中,若是Integer canJoinNun爲null 就把值設置爲0
if (publishMsg.getCanJoinNum() == null) {
   publishMsg.setCanJoinNum(0);
}

關於開啓druid的監控界面

maven包的引入:html

<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服務器上時,便出現插入中文字符串,最後卻顯示==?==的狀況。java

解決方法:在jdbc的連接後面加上characterEncoding=utf8便可mysql

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

​ 不過,仍是不懂爲何在本地不加characterEncoding=utf8也沒問題。nginx

關於跳轉的問題

場景:此時我有一個xxx.com的域名,我用nginx作代理,將xxx.com/project_A/**的請求轉到springboot的project_A項目中。這時候咱們不可能在每個路由RequestMapping中,前面都加上一個project_A吧。git

nginx的配置:github

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的項目中。web

那麼在前端的thymeleaf中,應該怎麼修改呢?

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

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

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

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

在ajax請求中,請求路由的寫法:

<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引用解析的時候就會變成

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

在後端的RequestMapping中,並不須要去修改裏面的值,甚至說,return "redirect:/page/index"都不須要去修改。可是,卻有一個奇葩,那就是在攔截器中的那個重定向:

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

由於在攔截器中,咱們只可以return true或者false,因此咱們進行重定向就得使用response.sendRedirect進行重定向,若是咱們這樣使用,那麼它進行重定向就會重定向到xxx.com/login/index去,而不是xxx.com/project_A/login/index

因此咱們不得不更改成response.sendRedirect("/project_A/login/index");

不過我總感受應該會有其餘方法去解決這個問題,由於這樣作的話,一旦更改,就必須得從新改代碼或者文件。若是有的話,能夠在評論區留言,謝謝。

數據庫的時間問題

在mybatis中,向數據庫插入時間直接使用java.util.Date便可。

springboot mybatis下劃線轉駝峯

原本覺得可以本身轉的,而後發現本身想多了,╮(╯▽╰)╭

mybatis:
   # mapper的位置
 mapper-locations: classpath:mapper/*.xml
 configuration:
      # 開啓下劃線轉駝峯
 map-underscore-to-camel-case: true

Springboot MySql分頁AOP

場景:有多個網頁,可是每一個網頁的每一頁都只顯示數據庫的10條數據,這個時候咱們便須要進行分頁。可是若是每次去select數據是,都去寫一次分頁,這毫無疑問,是一個重複的勞動力。OK,既然OOP是重複的勞動力,那麼咱們便使用AOP吧。

maven引入

<!-- 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得到數據裏面的數據

// Mapper
   @Autowired
   private GetMsgMapper getMsgMapper;

   @Override
   public Object getJoinMsgsWithPage(Integer page, String id) {
      return getMsgMapper.getJoinMsgs(id);
   }

切面的寫法

@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裏面去調用的時候就很爽了

調用示例:

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

在這裏面,返回的pageInfo就是已經通過分頁的數據了。

本身蠢了的地方 404 NOT FOUND

在將springboot項目部署到服務器上面的時候,剛開始只想試試能不可以部署成功,而後就暫時沒有將本地的數據庫部署上去。再而後,就陷入了爲啥本地能運行而遠端不能運行的死循環了。到後面才發現,由於沒法連接數據庫,project都沒有啓動。╮(╯▽╰)╭

 

img
img
相關文章
相關標籤/搜索