springboot项目构建过程中易踩坑点

文章目录

  • 写在前面
    • 1、mysql驱动相关问题
      • 1.1、时区问题
      • 1.2、驱动版本问题
    • 2、spring默认日志
      • 2.1、日志配置logging.file
    • 3、JPA相关问题
      • 3.1、@Table(name=“XXX”)报错
      • 3.2 、字段命名时提示错误
      • 3.3 、报错'@Query' not applicable to field
      • 3.4、 报错JPA-style positional param was not...
    • 4、idea相关问题
      • 4.1、idea创建spring项目时遇到的问题
      • 4.2、解决新建maven项目仓库变化的问题
      • 4.3、idea创建spring项目特别慢
    • 5、打包与发布
      • 5.1、打jar包运行时,java版本错误
      • 5.2、使用node.js静态资源发布
      • 5.3、windows下使用nginx
    • 6、jar包、tomcat 、外部资源相关
      • 6.1、springboot映射外部资源
    • 7、Spring注解
      • 7.1、@Value

写在前面

2020年9月27日
因为涉及spring版本问题,这里的踩坑记录适合于:
spring boot 2.3.4.RELEASE
thymeleaf 3.0.2.RELEASE

其他版本自行分辨

1、mysql驱动相关问题

1.1、时区问题

运行spring项目报类似这样的错误:The server time zone value ‘???’ is unrecognized or represents more than one time zone.
springboot项目构建过程中易踩坑点_第1张图片
解决方案:在你的配置文件jdbc连接末尾加上:&serverTimezone=Hongkong
springboot项目构建过程中易踩坑点_第2张图片
你可能看见很多教程叫你加:&serverTimezone=UTC
UTC也可以,但那是美国时区,和国内相差8、9个小时,
除了可以写成Hongkong以为,还可以写成Shanghai。

1.2、驱动版本问题

运行spring项目报类似这样的错误:Loading class `com.mysql.jdbc.Driver’. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver’.
在这里插入图片描述
上面这串英文翻译过来就是解决方案:把com.mysql.jdbc.Driver替换成com.mysql.cj.jdbc.Driver
springboot项目构建过程中易踩坑点_第3张图片
com.mysql.jdbc.Driver 是 mysql-connector-java 5中的,
com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6中的。
所用它两具体用谁,看你的依赖用的哪个版本
springboot项目构建过程中易踩坑点_第4张图片

2、spring默认日志

2.1、日志配置logging.file

在新的版本中 logging.file 和 logging.path 过时,要使用以下两个:

logging.file.name 可以指定路径和log文件的名字

logging.file.path 只可以只当log的路径, 不能指定log的名字, 使用默认命名spring.log

两个不能同时使用,同时配置了,只有logging.file.name生效

3、JPA相关问题

3.1、@Table(name=“XXX”)报错

报错原因Hibernate4.3以后不支持@Table(name=“tablename”),
请使用@Entity(name=“tablename”)代替@Table(name=“tablename”)。

JPA是Hibernate遵循的规范之一

3.2 、字段命名时提示错误

如下图
springboot项目构建过程中易踩坑点_第5张图片
这个是idea检测出来的,实际并不影响运行,错误的原因是因为注解的字段没有与idea的数据连接进行关联。

解决步骤:
1、找到Persistence》右击sessionFaccory》点击Assign Data Sources
springboot项目构建过程中易踩坑点_第6张图片
2、选择对应的数据库
springboot项目构建过程中易踩坑点_第7张图片
然后这个报错就没有了

3.3 、报错’@Query’ not applicable to field

翻译:’@Query’不能应用在字段上。

这种报错就是你把()漏掉了,就成了写在字段上了。
在这里插入图片描述

3.4、 报错JPA-style positional param was not…

在sql代码里,?后面有数字,数字不能直接接;分号,要加个空格
在这里插入图片描述

4、idea相关问题

4.1、idea创建spring项目时遇到的问题

遇到Error parsing JSON response这样的错误
springboot项目构建过程中易踩坑点_第8张图片
解决办法1:修改HTTP Proxy
springboot项目构建过程中易踩坑点_第9张图片

注意最后这里输入的是:https://start.spring.io
必须有是https

解决办法2:创建时该地址为https://start.aliyun.com
springboot项目构建过程中易踩坑点_第10张图片

4.2、解决新建maven项目仓库变化的问题

到other settings里面修改,改完点保存
springboot项目构建过程中易踩坑点_第11张图片

4.3、idea创建spring项目特别慢

可以直接用浏览器访问https://start.aliyun.com
springboot项目构建过程中易踩坑点_第12张图片
建好项目,下载,然后再用idea打开就可以了

5、打包与发布

5.1、打jar包运行时,java版本错误

类似这样的错误

Exception in thread "main" java.lang.UnsupportedClassVersionError: 
demoApplication has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

原因可能是系统的java版本低了,下载一个版本高点的java
(这里我换成了java 11解决了这个问题 )

5.2、使用node.js静态资源发布

使用node.js发布静态资源

1、下载node.js

https://nodejs.org/zh-cn/

然后直接安装就可以了

2、检查是否有npm
安装完成,在cmd输入npm -v
成功显示版本表示有

3、发布静态资源
在cmd输入npx http-server c:/html/

5.3、windows下使用nginx

需要注意,nginx的config文件,用记事本编辑后一旦有中文并保存后,记事本会将配置文件转为带BOM头的文件。容易报错,Linux下使用vim编辑、windows下建议使用一些代码编辑软件去写。

6、jar包、tomcat 、外部资源相关

使用外置tomcat发布spring参考:

https://segmentfault.com/a/1190000015173569?utm_source=sf-related

springboot工程打成jar包后运行时,读取外部的配置文件

https://blog.csdn.net/whuzjn/article/details/106921960

6.1、springboot映射外部资源

springboot项目打成jar包后,是无法访问jar包以外的资源。
如果外部资源不多,我们想通过浏览器直接能访问jar包以外的资源,
就需要将外部路径映射成静态资源路径。

本文参考文章: https://blog.csdn.net/duangecho/article/details/80258300

第一步,在application.yaml里面配置server.tomcat.basedir

server.tomcat.basedir:配置 Tomcat 运行日志和临时文件的目录。若不配置,则默认使用系统的临时目录。
更多内置tomcat说明参考:https://www.hangge.com/blog/cache/detail_2457.html

springboot项目构建过程中易踩坑点_第13张图片
第二步:添加一个配置类MyConfig.java
springboot项目构建过程中易踩坑点_第14张图片


import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.io.File;
import java.io.FileNotFoundException;

@Configuration
public class MyConfig implements WebMvcConfigurer {
     
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
     
        File path = null;
        try {
     
            path = new File(ResourceUtils.getURL("classpath:").getPath());
        } catch (FileNotFoundException e) {
     
            e.printStackTrace();
        }
        String gitPath=path.getParentFile().getParentFile().getParent()+File.separator+"logistics"+File.separator+"uploads"+File.separator;
        registry.addResourceHandler("/uploads/**").addResourceLocations(gitPath);
        registry.addResourceHandler("/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");
    }
}

如上配置类主要配置了 能够访问的静态资源路径

第三步:把项目打包运行
springboot项目构建过程中易踩坑点_第15张图片

在jar包所在路径输入java -jar XXX.jar运行

第四步:静态资源
在jar包所在路径,我们可以看到生成了一个logistics文件夹
springboot项目构建过程中易踩坑点_第16张图片
我们在logistics里新建一个uploads文件夹,
再往uploads里面新建一个html文件夹,并放入1.html
springboot项目构建过程中易踩坑点_第17张图片
这样就可以成功访问静态资源1.html了
在这里插入图片描述

7、Spring注解

7.1、@Value

@Service
public class yy {
     
	@Value("${spring.application.name}")
    private String mmm;

	public void mu() {
     
		 System.out.println(mmm);
	}
}

使用@Value有几个条件

  • 1、必须采用 依赖注入的方式进行实例化(也就是不能new,必须有@Service、@Component这样的注解在类头上)。
  • 2、不支持把值注入到静态变量中(也就是不能有static关键字)
  • 3、不能使用显式的构造方法(也就是init() 方法)

如果想让静态方法获取值,可以利用一个set方法获取

@Service
public class yy {
     
    private static String mmm;
    
	@Value("${spring.application.name}")
  	private void setMmm(String mmm){
     
    	this.mmm = mmm;
  }
	
	public void mu() {
     
		 System.out.println(mmm);
	}
}

如果想让显式的构造方法获取值,可以利用@PostConstruct

@Service
public class yy {
     
	@Value("${spring.application.name}")
    private String mmm;
    
  	@PostConstruct //加上该注解表明该方法会在bean初始化后调用
	private void init() {
     
	  System.out.println(mmm);
	}

}

你可能感兴趣的:(java,spring)