记一次SpringBoot 开发中所遇到的坑和解决方法
记一次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即可
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的配置:
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="@{……}"
<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都没有启动。╮(╯▽╰)╭
记一次SpringBoot 开发中所遇到的坑和解决方法的更多相关文章
- 前端webview开发中遇到的一些问题及其解决方法
最近做了一个webview中的兑换页面,本来以为很简单,想不到遇到了远远超出预期数量的BUG,记下来,以备后患. 1 inline-block元素折行 BUG描述:现在我有三个DIV,要在一列等宽排列 ...
- Python和Ruby开发中源文件中文注释乱码的解决方法(Eclipse和Aptana Studio3均适用)
Eclipse的设置(Aptana Studio3与Eclipse基本完全相同,此处略) window->preferences->general->editors->text ...
- 记一个VS连接过程中找不到cpp的解决方法
在新增几个qt页面时,发现原来没动的几个cpp 连接报错了,错误均是qt的相关文件找不到 应该是moc文件没有生产或者没有被包含进工程.我想着既然我没动,应该不会是moc的原因,就在其他方向解决了很久 ...
- 关于微信H5页面开发中音乐不自动播放的解决方法
我想应该有很多人在做H5场景应用.H5微刊.H5微杂志的时候加入背景音乐吧(客户需求),相信很多人一定碰过不能自动播放的时候,即使是相同的iPhone 5s也有不播放的时候,很蛋疼吧!? 之前我的解决 ...
- 使用Python过程中遇到的一些坑及其解决方法(持续更新)
1.列表不能直接赋值 nums1 = nums2 x nums1[:] = nums2 正确 2.返回列表某一元素的值可以使用index函数 aList = [123, 'xyz', 'runoob' ...
- Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义
Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义 首先我们指明,任何一种行动以及教派修行方法都有他的多元化,只看到某一方面,就不能很好的评估利弊,适不适合自己使 ...
- Java 开发中如何正确踩坑
为什么说一个好的员工能顶 100 个普通员工 我们的做法是,要用最好的人.我一直都认为研发本身是很有创造性的,如果人不放松,或不够聪明,都很难做得好.你要找到最好的人,一个好的工程师不是顶10个,是顶 ...
- 在Android开发中,定时执行任务的3种实现方法
在Android开发中,定时执行任务的3种实现方法: 一.采用Handler与线程的sleep(long)方法(不建议使用,Java的实现方式)二.采用Handler的postDelayed(Runn ...
- Android开发华为手机无法看log日志解决方法
Android开发华为手机无法看log日志解决方法 上班的时候,由于开发工具由Eclipse改成Android Studio后,原本的华为手机突然无法查看崩溃日志了,大家都知道,若是无法查看日志要它毛 ...
随机推荐
- vue-cli入门
这也仅仅是入门而已了☺ 自己也在慢慢学习中,不对的地方希望大佬可以多多指教,请不吝赐教,感激不尽. 这章主要是搭建环境: 1.安装node环境 从官网下载并安装node,傻瓜操作,安装完成之后,命令行 ...
- HTML5中input标签有用的新属性
HTML5对input增加了一些新标签,个人觉得比较常用有效的以下几个 placeholder=“请输入” 常见用于默认提示 autofocus 自动聚焦到当前输入框 maxlength=" ...
- Django+easyui 快速开发
Django的使用我们可以查看上一篇博客,今天我们要在Django中使用easyui快速开发,在我们安装好Django, 我们可以道改地址那一下easyui 官方API文档(http://downlo ...
- 学习笔记----php环境配置
Php开发环境自定义搭建 (万事开头难) 第一步:Apache安装(httpd-2.4.37-win64-VC15.zip) 下载已编译apache安装包:Apachelounge官方下载地址:htt ...
- unigui 1.90.0 Example
Example//-------------------------------------1:[UNG-2783] - ReCaptcha -------//无法显示 //------------- ...
- pycharm激活码
MTW881U3Z5-eyJsaWNlbnNlSWQiOiJNVFc4ODFVM1o1IiwibGljZW5zZWVOYW1lIjoiTnNzIEltIiwiYXNzaWduZWVOYW1lIjoiI ...
- [转] Customizing OpenStack RBAC policies
http://www.florentflament.com/blog/customizing-openstack-rbac-policies.html OpenStack uses a role ba ...
- 【高速接口-RapidIO】5、Xilinx RapidIO核例子工程源码分析
提示:本文的所有图片如果不清晰,请在浏览器的新建标签中打开或保存到本地打开 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:Vivado2015.4.2 ...
- nginx安装配置并布置网站
之前做的网站都是用的apache,关于apache和Nginx的区别也不说了,百度上也都有,而且apche和nginx可以共存,这个之后再说. 首先安装nginx,我用的云主机,直接用yum安装 #y ...
- 传参导出Excel表乱码问题解决方法
业务场景 先描述一下业务场景,要实现的功能是通过搜索框填写参数,然后点击按钮搜索数据,将搜索框的查询参数获取,附加在链接后面,调导Excel表接口,然后实现导出Excel功能.其实做导Excel表功能 ...