java开发中遇到的问题及解决⽅法
⼀、⽂件路径问题⼤集合
1、Property("user.dir") #获取当前项⽬⽂件夹在磁盘上的绝对路径(java命令执⾏的地⽅)
2、File tmpFile = new File("/tmp/tomcat"); #这样会在当前项⽬所在磁盘的根路径下创建该⽂件夹
3、File tmpFile = new File("tmp/tomcat"); #这样就是在当前项⽬的根⽬录下创建该⽂件夹 。。默认是从当前项⽬根⽬录下开始
4、File tmpFile = new File("../tmp/tomcat"); #与项⽬同级创建该⽂件夹
5、String fileAbsolutePath = CanonicalPath(); #获取解析后的⽂件(夹)的绝对路径,如
D:\java\companyProject\zt_slimming\..\headImg =》D:\java\companyProject\headImg
classpath⾥⾯时
classLoader默认就是从当前类路径下classpath/ 开始加载,所以不⽤加 /
class 默认是从当前类的位置开始加载,加上/ 就代表从类路径下开始加载。
斜杠(/)和反斜杠(\)
java中⼀般⽤斜杠 /
window的⽂件路径为 \ ,因为需要转义,所以要 \\ 。但通过 / 同样可以定位到⽂件。
Linux的⽂件路径为 /
数据库中存储是就存 /
⼆、路径中带有中⽂或空格时会提⽰不到资源
如:从类路径下获取某个⽂件的⽂件路径,提⽰不到资源:
String filePath = Class().getClassLoader().getResource("word/xunhuan.docx").getPath();
解决:加上toURI()⽅法即可
String filePath = Class().getClassLoader().getResource("word/xunhuan.docx").toURI().getPath();
PS:直接获取对应的流时,路径中带有中⽂或空格就没有关系了。
三、springBoot项⽬jar包转换成war包,并部署到tomcat服务器上
为什么要转成war包?
war包更像是⼀个⼤的应⽤资源容器,⽽jar包更像是⼀个功能单元,打成war包后就能随意的访问war包内的任意资源,但jar包却不可以。步骤:两⼤步
1、修改l⽂件
1.1 packaging改成war包
<groupId>com.jyf</groupId>
<artifactId>online_exam</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>online_exam</name>
<!--1、修改打成war包,默认为jar包-->
<packaging>war</packaging>
<description>Demo project for Spring Boot</description>
1.2 排除内置的tomcat服务器
<!--推荐:2、添加tomcat的依赖,可以⾃动排除掉内置的tomcat,并提供javax.servlet-api-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>//只在编译时有效,打包运⾏时就是⽤服务器的环境了
</dependency>
或者在spring-boot-starter-web中排除tomcat的依赖,并额外添加javax.servlet-api(provided) 1.3添加项⽬名(可选)
<!--指定当前项⽬的上下⽂名称(如果需要的话)
项⽬改成war包后,springBoot配置中配置的端⼝号,contextPath就⽆效了
,如果需要指定,可以在这⾥修改项⽬名,在tomcat的配置⽂件中修改端⼝号 -->
<build>
<!--<finalName>/online_exam</finalName>-->
</build>
2、修改启动类
继承SpringBootServletInitializer,并重写其configure⽅法
@SpringBootApplication
@MapperScan(basePackages = "com.zhaotai.mapper")
public class OnlineExamApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(OnlineExamApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(OnlineExamApplication.class);
}
}
之后使⽤maven clean、compile、 package 打包即可
3、部署到tomcat上并访问(Tomcat8.5及以上版本)
由于原来访问时,是直接从端⼝号开始的没有项⽬名,在tomcat中也想这么做的话,有两种⽅式:⽅式⼀:默认的ROOT⽬录
webapps下新建ROOT⽂件夹:将war包中的⽂件夹放到ROOT下即可。
⽅式⼆:虚拟路径映射
<Context path="" docBase="F:\temp" reloadable="false" />
fastjson常用方法path:代表项⽬名。此时 如 localhost:8080 这样就可以访问。
docBase:代表项⽬的绝对路径。如:F:\temp\sixBookStore
注意:如果是直接放到webapps下,默认是根据项⽬的⽂件名进⾏访问的。
此时后台路径的 “/” 就代表当前项⽬的根⽬录,但前台的 “/”代表当前端⼝号下,所有就访问不了后台,所以要在访问路径中加上当前项⽬的contextPath。
如:使⽤Thymeleaf的内联表达式 var path = "[[${#ContextPath()}]]";
后台整个 ServletContextListener 在服务器启动时在application域中添加代表当前项⽬根⽬录的⼀个变量,前台:var path = "${ContextPath}";
四、接收和返回时间格式的处理
1、Date类型接收格式
⾸先,java Date类型默认的接收时间格式为 xxxx/xx/xx xx:xx:xx,但前端的⽇期插件和数据库中默认时间格式都为 xxxx-xx-xx
xx:xx:xx。
所以为了后台能正确接收需要
⽅式⼀、使⽤@DateTimeFormat注解,局部的较灵活
⽅式⼆、配置⽂件中 spring.mvc.date-format=yyyy-MM-dd HH:mm:ss 全局的,不太灵活
例如:
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//接收时
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")返回时
private Date createTime;//创建时间
2、Date类型返回格式
jackson⽅式:
springBoot默认使⽤Jackson作为HttpMessageConverter(消息转换器),此时直接在实体类的属性上使⽤@JsonFormat注解,即可按照指定的时间格式返回,注意要添加时区 timezone="GMT+8"。
局部的:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
yml⽂件中全局配置:
spring:
#配置统⼀的⽇期返回格式
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
注意:若全局和和局部的⽅式都存在的话,采⽤就近原则:局部的会覆盖全局的。
fastJson⽅式:
使⽤fastJson 的@JsonField注解:@JSONField(format = "yyyy-MM-dd HH:mm:ss")
此时需要注⼊FastJson的转换器来替换掉默认的
@Bean
public HttpMessageConverters httpMessageConverter(){
FastJsonHttpMessageConverter fastJson = new FastJsonHttpMessageConverter();
return new HttpMessageConverters(fastJson);
但是FastJson默认所有为null的属性不参与序列化,所以返回结果中将没有这些属性。
解决: 在所有可能为null的属性上添加 @JsonFiled注解的⼀个属性即可:@JSONField(serialzeFeatures =
SerializerFeature.WriteMapNullValue)
五、上传⽂件⼤⼩限制(Tomcat服务器)
tomcat默认的上传⽂件的⼤⼩为2MB,
<!--maxPostSize="0":对于post请求的数据不限制⼤⼩,解决⽂件上传⼤⼩限制问题,默认为2MB。
connectionTimeout="20000":20秒的有效连接,可以设置的⼤⼀点来解决⼤⽂件上传 -->
<Connector connectionTimeout="20000"
maxPostSize="0"
port="8080"
protocol="HTTP/1.1"
redirectPort="8443"/>
springboot默认的上传的单个⽂件⼤⼩为1MB,⼀次请求的多个⽂件⼤⼩为10MB,
参看源码配置类 MultipartProperties
springBoot中配置⽂件上传⼤⼩:
springboot2.x
spring.servlet.multipart.max-file-size=5MB #单个⽂件的最⼤⼤⼩限制
spring.servlet.multipart.max-request-size=30MB #单个请求中多个⽂件的最⼤⼤⼩限制
springboot1.x
spring.http.multipart.max-file-size=5MB
spring.http.multipart.max-request-size=30MB
六、上传⽂件临时⽬录问题(Tomcat服务器)
⽂件上传会先上传到OS的临时⽬录中,在同步到设定⽬录中。
window下:C:\Users\ADMINI~1\AppData\Local\Temp\ 环境变量->⽤户变量的TEMP变量值
Linux下:/tmp
如果是⽤外部的servlet容器,如Tomcat,则会在tomcat启动的时候在catalina.sh⾥⾯,将tomcat的临时⽬录temp的路径位置赋值给OS 的临时⽬录,这样上传的资源就会到tomcat的temp⽬录下,在同步到设定的⽬录中。当tomcat重启时会清空temp的内容。
如果是⽤内嵌的servlet容器,如springBoot项⽬,当项⽬启动时,会创建⼀个临时⽬录⽤来存放上传的⽂件资源(临时⽬录就是OS的临时⽬录),当部署到Linux下,Linux会每隔10天⾃动清理不使⽤的临时⽬录,就导致⽂件上传不上去。
解决:指定⼀个⽬录当做临时⽬录,这样就不会被Linux清理掉了
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
String location = Property("user.dir") + "/../tempUpload";//与项⽬同级创建该⽂件夹
File tmpFile = new File(location);
if (!ists()) {
tmpFile.mkdirs();
}
factory.setLocation(location);
ateMultipartConfig();
}
七、系统控制台打印出有颜⾊的字符
如:
System.out.println("\033[31;44;0m" + "我滴个颜⾊" + "\033[31;44;0m");
System.out.println("\033[33;0m"+"异常为:"+"\033[33;0m");
格式:
前缀:\033[ 中间:颜⾊;背景⾊;样式 后缀m
中间的任意⼀个不写默认为不加该样式
范围:颜⾊表达式后⾯的所有,除⾮遇到另⼀个颜⾊表达式
颜⾊1背景⾊样式
30 ⽩⾊40-47颜⾊和颜⾊1⼀样0 空样式
31 红⾊ 1 粗体
32 绿⾊ 4 下划线
33 黄⾊7 反⾊
34 蓝⾊
35 紫⾊
36 浅蓝
37 灰⾊
⼋、配置多个springBoot项⽬在Run Dashboard中运⾏
idea中不像eclipse中有workspace和project的概念,取⽽代之的是project和module的概念。当我们在同⼀个project下建⽴多个module 时,⽐如我们要做⼀个springBoot的maven多模块项⽬,默认情况下idea是会⾃动检测多个springBoot项⽬,当同时启动第⼆个springBoot项⽬时会询问你是否在Run Dashboard(顾名思义叫运⾏仪表盘,可以⽅便管理多个项⽬的运⾏和停⽌等操作)中运⾏。如果前⼏个module都是在Run Dashboard中运⾏,新建的module不在Run Dashboard中运⾏了,可以是idea的run configurations没配置好:
通过Run-》Edit Configurations 打开运⾏配置,可以看到
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论