当前位置:   article > 正文

springboot项目构建过程中易踩坑点_@value' not applicable to field

@value' not applicable to field

写在前面

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.
在这里插入图片描述
解决方案:在你的配置文件jdbc连接末尾加上:&serverTimezone=Hongkong
在这里插入图片描述
你可能看见很多教程叫你加:&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
在这里插入图片描述
com.mysql.jdbc.Driver 是 mysql-connector-java 5中的,
com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6中的。
所用它两具体用谁,看你的依赖用的哪个版本
在这里插入图片描述

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 、字段命名时提示错误

如下图
在这里插入图片描述
这个是idea检测出来的,实际并不影响运行,错误的原因是因为注解的字段没有与idea的数据连接进行关联。

解决步骤:
1、找到Persistence》右击sessionFaccory》点击Assign Data Sources
在这里插入图片描述
2、选择对应的数据库
在这里插入图片描述
然后这个报错就没有了

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这样的错误
在这里插入图片描述
解决办法1:修改HTTP Proxy
在这里插入图片描述

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

解决办法2:创建时该地址为https://start.aliyun.com
在这里插入图片描述

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

到other settings里面修改,改完点保存
在这里插入图片描述

4.3、idea创建spring项目特别慢

可以直接用浏览器访问https://start.aliyun.com
在这里插入图片描述
建好项目,下载,然后再用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
  • 1
  • 2

原因可能是系统的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

在这里插入图片描述
第二步:添加一个配置类MyConfig.java
在这里插入图片描述


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/");
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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

第三步:把项目打包运行
在这里插入图片描述

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

第四步:静态资源
在jar包所在路径,我们可以看到生成了一个logistics文件夹
在这里插入图片描述
我们在logistics里新建一个uploads文件夹,
再往uploads里面新建一个html文件夹,并放入1.html
在这里插入图片描述
这样就可以成功访问静态资源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);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

使用@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);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/226955
推荐阅读
相关标签
  

闽ICP备14008679号