记录开发一个完整SpringBoot项目的过程。

一、项目初始化

1.1 使用 Liquibase作为数据库迁移工具

第一步:引入 Liquibase 依赖:

        <!-- 数据库迁移工具: liquibase--><dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId></dependency>

注意,于此同时需要引入: spring-boot-starter-data-jpa 的依赖,否则,启动SpringBoot项目,数据库表不能创建。

第一步:编写 db/changelog/db.changelog-master.yaml 文件

1.2 SpringBoot集成MyBatis

1.3 SpringSecurity logout 出现404

spring security 在开启 csrf 防护的情况下, /logout 必须以post的方式提交。使用Thymeleaf时,表单如下:

<form th:action="@{/logout}" method="post" class="form-inline my-2 my-lg-0"><button class="btn btn-outline-secondary my-2 my-sm-0" type="submit">退出登录</button>
</form>

二、thymeleaf 模板 ,html中遇到的问题

参考:https://www.thymeleaf.org/doc/articles/layouts.html

3.1  An invalid form control with name='' is not focusable.

出现该错误的原因是chrome发现了有隐藏(display:none)的required需求元素,所以会出错。
将ng-show改为ng-if,从隐藏标签变为移除dom,可以避免这个错误。

3.2 sec标签 不起作用

<html lang="en" xmlns:th="http://www.thymeleaf.org"xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"

添加依赖:

<!--        thymeleaf 使用Spring Security进行页面保护,需要配置的方言--><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity5</artifactId><version>${thymeleaf-extras-springsecurity5.version}</version></dependency>

三、项目使用jquery遇到的问题

3.1 ajax 400错误

出现400错误,是由于ajax传递的参数有问题,应该讲data转换成json格式:使用 JSON.stringify() 函数

// ajax 参数var data = JSON.stringify({"currentPage": currentPageNum, "pageSize": pageSize, "eid": eid});

ajax的代码如下:

  function ajaxFindPage(headers, data, url) {$.ajax({type: "POST",dataTypes: "json",contentType: "application/json",url: url,data: data,headers: headers,success: function (response) {// 结果的状态var status = response.status;if (status == 0) {var result = response.result;console.log(result);} else {console.error("Ajax Exception: " + url);}}});}

controller的代码如下:

@RequestMapping(value = "/findPageCurrentUserEdmApplyOrdersByQuery", method = RequestMethod.POST)@ResponseBodypublic ResponseResult findPageCurrentUserEdmApplyOrdersByQuery(@RequestBody EdmApplyOrderQuery edmApplyOrderQuery){
.......
}

四、发送邮件

    @Autowiredprivate JavaMailSender javaMailSender;@Autowiredprivate TemplateEngine templateEngine;@Overridepublic void sendThymeleafEmail(EdmLiuZhuanEmailParameters edmLiuZhuanEmailParameters) {MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper helper = null;try {helper = new MimeMessageHelper(mimeMessage);.........}

4.1 遇到这么一个问题:

java.lang.IllegalStateException: Not in multipart mode - create an appropriate MimeMessageHelper via a constructor that takes a 'multipart' flag if you need to set alternative texts or add inline elements or attachments.

解决方案:

helper = new MimeMessageHelper(mimeMessage, true);

4.2 附件名称过长,接收端收到的是乱码文件

解决方案: 在发邮件的功能上添加一句配置:

// 解决附件名称过程,发送乱码问题
System.setProperty("mail.mime.splitlongparameters", "false");

五、下载附件

参照了:https://www.javainuse.com/spring/boot-file-download

关于: attachment 和 inline的区别

设置attachment ,浏览器会老老实实地显示另存为的对话框;设置inline,浏览器都会自动尝试用已知关联的程序打开文件。

response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));

六、Mybatis

遇到下面一个错误:

Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'roleName' in 'class java.lang.String'

需要在参数前加上 @Param 注解

/*** 根据用户权限名称查询用户* @param roleName* @return*/@Select({"<script>","SELECT b1.`eid`, b1.`username`, b1.`password`, b1.`email`, b1.`department`, b1.`level` ","FROM `edmers` b1 ","inner join (","select t2.eid from edmer_role_relation t2 inner join edm_roles t3 ","on t2.rid = t3.rid ","where 1=1 ","<if test='roleName != null'>","and t3.role_name=#{roleName}","</if>",")b2 on b1.eid=b2.eid","</script>"})@Results(value = {@Result(id = true, column = "eid", property = "eid"),@Result(column = "username", property = "username"),@Result(column = "password", property = "password"),@Result(column = "email", property = "email"),@Result(column = "department", property = "department"),@Result(column = "level", property = "level"),@Result(property = "roles", column = "eid", javaType = List.class,many = @Many(select = "com.edm.edmfetchdataplatform.mapper.RoleMapper.findRoleByEid"))})List<Edmer> findEdmersByRoleName(@Param("roleName") String roleName);

项目部署,部署到正式环境上

错误:java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times (参考: https://www.imooc.com/qadetail/256163)

报出这个错误,可能原因:

1、检查MySQL数据库服务是否正常(包含检查服务名和密码),如果不正常,修复至正常为止;

2、maven工程中导入的mysql的jar版本和你的MySQL版本不相符,必须相一致才行!比如,你安装的MySQL是8.x,必须使用高版本对应的mysql-connector-java-8.x.x,在MySQL官网下载对应jar时提示如下:MySQL Connector/J 8.0 is highly recommended for use with MySQL Server 8.0, 5.7, 5.6, and 5.5. Please upgrade to MySQL Connector/J 8.0.

3、连接数据库相关的属性和值不正确或缺失,按照报错提示修改或更新即可。

注:我直接将maven工程导入eclipse,修改过数据源相关属性后,启动也报同样的错误,但是MySQL服务是正常的,后面检查发现,我的MySQL安装的是高版本(8.0.11),而工程对应的mysql连接jar包是5.x版本,将低版本替换为mysql-connector-java-8.0.11.jar,同步更新对应的连接属性,启动成功。

主要替换的内容(有好几处,有些在xml配置文件中,有些在java代码中,替换时全文搜索):

1、将所有的drivername值都从com.mysql.jdbc.Driver修改为com.mysql.cj.jdbc.Driver

2、在url的参数后面新增时区参数:&serverTimezone=UTC

3、修改url连接参数中的值更新为:zeroDateTimeBehavior=CONVERT_TO_NULL

SpringBoot项目开发实录相关推荐

  1. springboot项目开发实战

    文章目录 springboot项目开发实战之后端流程详解 一.创建简单的springboot之web项目 1.简单springboot框架环境搭建 2.相关jar包的导入 3.配置文件yaml的设置 ...

  2. vue项目开发实录--仿去哪儿网App-张鹏-专题视频课程

    vue项目开发实录--仿去哪儿网App-160人已学习 课程介绍         本课程为vue项目开发实录(仿去哪儿网App)其中涉及到知识点有:组件搭建,路由,vuex,axios,webpack ...

  3. Vue全家桶 - 电商后台管理系统项目开发实录(详)

    目录 1. 项目概述 1.1 电商项目基本业务概述 1.2 电商后台管理系统的功能 1.3 电商后台管理系统的开发模式(前.后端分离) 2. 项目初始化 2.1 前端项目初始化步骤 码云相关操作 2. ...

  4. SpringBoot项目开发(十):引用本地jar包与打包本地jar

    标题可能有点绕口,在实际开发中,有时所引用的jar架包无法在 maven 中央仓库里找到,那么j就要引用本地jar包,然而在项目开发完成后,需要打包部署时,引用的本地jar包没有打包进去部署包,就会导 ...

  5. Springboot项目开发(三)文件结构(个人理财系统)

    1.common里放shiro以及封装json数据的通用类Msg. 2.controller放置所有的控制器 3.interceptor放置拦截器,拦截用户访问网址.因为有shiro,所以实际上这个后 ...

  6. SpringBoot入门(1)——创建springBoot项目

    2019独角兽企业重金招聘Python工程师标准>>> 创建基本SpringBoot项目 开发工具:IDEA 由于本文仅作为个人学习记录,不做过多说明,多以截图 工程建好后主要有这么 ...

  7. 第一节:创建SpringBoot项目并运行HelloWorld

    SpingBoot 365计划开始更新了,计划手敲365个SpringBoot案例回顾总结形成知识体系.目前已经输出了32节的内容.所有源码托管在GitHub和Gitee上. 1.第一节:创建Spri ...

  8. 前端及后端项目开发工具

    1 前端项目开发工具:构建Vue项目 开发工具:HBuilder 作用:用来创建vue项目 web中间件:nodejs nodejs作用:用来解析开发者写好的js.jQuery.vue代码. 项目管理 ...

  9. Java毕业设计:养老院管理系统(Springboot项目)

    [辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...

最新文章

  1. 删库跑路大神「后悔」了?我只不过犯了大家都会犯的编程错误!
  2. python _、__和__xx__的区别
  3. 如何在生产环境部署K2的流程
  4. CSDN博客代码块代码没有高亮颜色解决办法
  5. leetcode面试题 16.21. 交换和(二分查找)
  6. 2.3线性表的链式表示和实现
  7. JS定时器小应用--设置闹铃
  8. 卸载nginx php mysql_centos7中配置nginx+php-fpm+swoole+mysql环境教程
  9. Bootstrap 3之美03-独立行,文字环绕,图片自适应,隐藏元素
  10. FreeBSD下MongoDB数据库的安装
  11. matlab加热模型,基于MATLAB钢丝感应加热模型及其温度场特性的研究
  12. Java并发编程,AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理
  13. 复变函数第一章第二章知识脑图
  14. Java冒泡排序详解
  15. 数据库系统概论判断题
  16. 2021基于Debian的All in One(NAS+软路由)配置教程
  17. c++空指针的定义-0L
  18. vmware启动报错Entering emergency mode
  19. 软件检测怎么做?第三方软件检测方案模板
  20. 范式BCNF,3NF的判断方法

热门文章

  1. 达梦数据库常用sql语句整理(3)
  2. 【论文精读】Pixel-wise Deep Image Stitching
  3. 制作动态logo教程
  4. Fibonacci(斐波那契数列)的实现
  5. 软考2022上半年上午题真题和知识点整理
  6. Oracle使用NID调整数据库的DBNAME和DBID
  7. JAVA编程假定要为某个公司编写雇员工资支付程序,这个公司有各种类型的雇员(Employee),不同类型的雇员按不同的方式支付工资
  8. 护师个人简历模板范文——带简历具体内容
  9. 插入排序算法(InsertionSort)
  10. 小米电视S65 和小米S75 参数配置 小米电视S65 和小米S7区别对比评测