SpringBoot+Jpa+Mysql入门项目登录界面(含遇到的所有坑)
##SpringBoot之前都是一知半解,这次做起来果然碰到了巨多的坑。为了以后不再踩坑,记录一下。
#所需的依赖:
redis(还没用到),thymeleaf(前端网页标签),web,jpa(java持久化规范),Hibernate,log4j,slf4j-log4j12,mybadis,mybatis(后面我给删了)
我的pom.xml:
[code]<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>new_energy</artifactId> <version>0.0.1-SNAPSHOT</version> <name>new_energy</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>2.1.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.4.1.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.8.0-beta4</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
#目录结构:
#第一个坑:Field XXX in XXXX required a bean of type XXXX that could not be found.
首先就是项目的启动器默认的话只会扫描自己所在的包及所有子包。所有如果像controller,dao,service这种没有放到启动器的包内或者子包里,就会加载不出来(可以参考我的目录结构).
解决办法一:就是把controller,dao这种统统放到子包里。
解决办法二:就是利用注解@ComponentScan({});
#第二个坑:nested exception is java.lang.NoClassDefFoundError: javax/persistence/Synchr
这个就是因为,我引入依赖的时候只引入了jpa,但其实还需要引入三个jar包:分别是Hibernate-entitymanager,log4j,slf4j-log4j12.
在这里顺便说一下,什么是jpa。
JPA是官方sun推出的JAVA持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术。
其实就是:
1.关系映射元数据
2.Java持久化api(在springboot里,只需要定义一个接口继承这个api,spring将会自动帮你完成接口,并放到容器里供你使用)
3.查询语言(JPQL)
#第三个坑:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one
mysql默认服务器时区的问题,改application.properties里的数据库设置:
[code]spring.datasource.url=jdbc:mysql://127.0.0.1:3306/book?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
就可以了。
#第四个坑:An attempt was made to call the method javax.persistence.spi.PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode; but it does not exist. Its class, javax.persistence.spi.PersistenceUnitInfo, is available from the following locations:
这个太坑了。。我之前创建项目的时候,多加了mybatis,然后mybatis自动引用依赖引入persistence-api-1.0.jar包,而persistence-api-1.0.jar的PersistenceUnitInfo类中并没有getValidationMode()方法,而在springboot(2.1.0.RELEASE)中自动引入的依赖persistence-api-2.2.jar包的PersistenceUnitInfo类则有实现getValidationMode()方法。此时两个类冲突了,导致报了以下的错误。解决方法就是在tk.mybatis中排除掉persistence-api-1.0.jar的自动依赖,如下:
[code] <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>1.1.1</version> <exclusions> <exclusion> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> </exclusion> </exclusions> </dependency>
#第五个坑:
There was an unexpected error (type=Internal Server Error, status=500).
Unknown integral data type for ids : java.lang.String; nested exception is org.hibernate.id.IdentifierGenerationException: Unknown integral data type for ids : java.lang.String
原因:实体类的主键是String,然后主键策略选择了自增。。报错了
一:改主键策略
二:改实体类的主键为int类型的id
#第六个坑:application.properties改成application.yml时出现:Failed to bind properties under 'server.servlet' to org.springframework.boot.autoconfigure.web.ServerProperties$Servlet:
原因:
我标红这里其实是应该加一个空格的!
再有坑我会继续补充。。
- spring boot项目快速构建(spring mvc+jpa+hibernate+mysql+gradle)
- Spring Boot / Spring MVC 入门实践 (三) : 入门项目介绍与用户注册登录的实现
- SpringBoot入门系列:第五篇 JPA mysql
- SpringBoot入门系列: JPA mysql(五)
- spring boot 1.5.4使用JPA,遇到Mysql区分大小写的问题
- SpringBoot入门系列:第五篇 JPA mysql
- springboot、jpa、maven、kothlin项目入门
- Spring-boot+JPA+Hibernate项目修改数据库MySQL为Oracle出现的问题
- Spring Boot / Spring MVC 入门实践 (三) : 入门项目介绍与用户注册登录的实现
- SpringBoot JPA MySQL 遇到中文乱码的解决办法
- SpringBoot入门系列:第五篇 JPA mysql
- SpringBoot入门系列:第五篇 JPA mysql
- Spring boot项目搭建入门
- spring-boot项目搭建及mysql配置实例
- [置顶] spring boot项目实战:JPA
- spring boot+spring data jpa+gradle+mysql配置问题
- Spring Boot+JPA+Mysql+ThymeLeaf快速构建CURD系统(一)Spring Boot介绍
- Spring Boot+JPA+Mysql+ThymeLeaf快速构建CURD系统(二)搭建SpringBoot工程
- 代码学习与实践 (一):Spring Boot 多模块项目创建与配置 注册 登录
- 第二十四章:SpringBoot项目整合JPA多数据源配置