您的位置:首页 > 编程语言 > Java开发

SpringBoot+Jpa+Mysql入门项目登录界面(含遇到的所有坑)

2019-03-22 14:37 916 查看

##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:

原因:

我标红这里其实是应该加一个空格的!

 

 

再有坑我会继续补充。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: