启动IntelLiJ IDEA,建立springBoot工程,搭建环境过程如下所示。
(1)pom.xml依赖文件
<?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>
<groupId>com.yzh.maven</groupId>
<artifactId>springbootmongodbdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springbootmongodbdemo</name>
<description>Demo project for Spring Boot</description>
<url>http://projects.spring.io/spring-boot/</url>
<!-- 继承父包,此包会添加依赖,spring用到的核心包-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
<relativePath></relativePath>
</parent>
<!-- spring-boot的web启动的jar包 -->
<dependencies>
<!-- web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- servlet 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat 的支持 .-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!-- 集成mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!--日志打印-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.6.2</version>
</dependency>
<!-- mybatis分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
<!—mongodb jar包支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.1</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>struts</groupId>
<artifactId>struts</artifactId>
<version>1.2.9</version>
<exclusions>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- Package as an executable JAR -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- Allow access to Spring milestones and snapshots -->
<!-- (you don't need this if you are using anything after 0.5.0.RELEASE) -->
<repositories>
<repository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
</project>
(2)建立application.yml或application.properties
1)application.properties
#端口
server.port=8088
#视图解析前缀
spring.mvc.view.prefix=/WEB-INF/jsp/
#视图解析后缀
spring.mvc.view.suffix=.jsp
#mongodb访问路径
spring.data.mongodb.uri=mongodb://localhost:27017/test
2)application.yml
server:
port: 8088
spring:
data:
mongodb:
uri: mongodb://localhost:27017/test
mvc:
view:
prefix: /WEB-INF/jsp/
suffix: .jsp
(3)建立webapp/WEB-INF/jsp路径
默认情况下,springboot并不支持jsp文件的解析,因此你需要加入上面pom.xml中的jar包:
<!-- spring-boot的web启动的jar包 -->
<dependencies>
<!-- web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- servlet 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat 的支持 .-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
如果需要通过controller层访问jsp,那么就需要在src/main目录下面手动建立webapp/WEB-INF/jsp目录,同时在该目录下建立jsp文件。
(4)建立实体类
package com.yzh.maven.entity;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection="userInfo")
public class UserInfo{
private String userName;
private String password;
private int age;
private String sex;
private String tel;
private String email;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public UserInfo(String userName, String password, int age, String sex,
String tel, String email) {
super();
this.userName = userName;
this.password = password;
this.age = age;
this.sex = sex;
this.tel = tel;
this.email = email;
}
public UserInfo() {
super();
}
@Override
public String toString() {
return "UserInfo [userName=" + userName + ", password=" + password
+ ", age=" + age + ", sex=" + sex + ", tel=" + tel + ", email="
+ email + "]";
}
}
注意:实体类的命名需要与mongoDB中的集合名字一一对应,例如:在mongoDB中的集合为userInfo,那么实体类为UserInfo;或者我们更推荐在实体类上方添加@Document(collection=”集合名”),以此来注明该实体类对应的是哪一个集合名称。
(5)建立UserInfoService接口
package com.yzh.maven.service;
import java.util.List;
import com.yzh.maven.base.plugin.Pagination;
import com.yzh.maven.entity.UserInfo;
/**
*
* @author
*/
public interface UserInfoService{
/**
* 添加
* @param User
*/
public void addUser(UserInfo User);
/**
* 删除
* @param id
*/
public void removeUser(String id);
/**
* 保存或修改
* @param User
*/
public void saveOrUpdateUser(UserInfo User);
/**
* 根据id查询单个
* @param id
* @return
*/
public UserInfo findById(String id);
/**
* 根据用户名查询
* @param id
* @return
*/
public UserInfo findByUsername(String username);
/**
* 查询所有
* @return
*/
public List<UserInfo> findAll();
/**
* 分页查询
* @return
*/
public void queryPage(Pagination<UserInfo> pagination);
}
(6)建立UserServiceImpl实现类
package com.yzh.maven.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;
import com.yzh.maven.base.plugin.Pagination;
import com.yzh.maven.entity.UserInfo;
import com.yzh.maven.service.UserInfoService;
/**
* @author
*/
@Repository
public class UserServiceImpl implements UserInfoService {
@Autowired
private MongoTemplate mongoTemplate;
public void addUser(UserInfo User) {
//1.如果没有指定集合,则默认添加到和对象名称相同的集合中,没有则创建一个
//2.也可以指定集合 mongoTemplate.save(User, "User_db");
mongoTemplate.save(User);
}
public void removeUser(String id) {
UserInfo User = findById(id);
mongoTemplate.remove(User);
}
public void saveOrUpdateUser(UserInfo User) {
mongoTemplate.save(User);
}
public UserInfo findById(String id) {
return mongoTemplate.findById(id, UserInfo.class);
}
public List<UserInfo> findAll() {
return mongoTemplate.findAll(UserInfo.class);
}
public UserInfo findByUsername(String username) {
//根据username查询
Query sql = new Query(Criteria.where("username").is(username));
return mongoTemplate.findOne(sql,UserInfo.class);
}
@Override
public void queryPage(Pagination<UserInfo> pagination){
//当前页
int pageNow = pagination.getPageNo();
//每页记录数
int pageSize = pagination.getPageSize();
//总记录数
int totalRecord = findAll().size();
int endRow = pageNow*pageSize;
if(totalRecord<endRow){
endRow = totalRecord;
}
//获取当前页信息
List<UserInfo> newResultList = new ArrayList<UserInfo>();
for(int i = (pageNow-1)*pageSize;i<endRow;i++){
newResultList.add(findAll().get(i));
}
//分页查询参数设置
List<UserInfo> results = newResultList;
pagination.setResults(results);
pagination.setTotalPage((int)Math.ceil(totalRecord/pageSize));
pagination.setTotalRecord(totalRecord);
}
}
说明:MongoTemplate类封装了Java对MongoDB数据库的基本操作,因此我们可以直接通过该类来操作MongoDB数据库。
(7)建立controller控制器
/* *
* Amendment History:
*
* Date By Description
* ------------------- ----------- -------------------------------------------
* 2018-08-31 yzh Create the class
*/
package com.yzh.maven.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.yzh.maven.base.model.DataMessage;
import com.yzh.maven.base.plugin.Pagination;
import com.yzh.maven.entity.UserInfo;
import com.yzh.maven.service.UserInfoService;
import org.springframework.web.bind.annotation.RestController;
/**
* @FileName UserInfoController.java
* @Description: 用户信息操作Controller
* @Date 2018年8月31日
* @author yzh
* @version 1.0.3
*
*/
@Controller
@RequestMapping("/list")
public class UserInfoController{
@Autowired
private UserInfoService userInfoService;
private static final Logger LOG = LoggerFactory.getLogger(UserInfoController.class);
/**
* @functionName: listUserInfos
* @description: 分页查询
* @param pageParams
* @author yzh
* @date 2018年8月31日
*/
@ResponseBody
@RequestMapping(value = "/listUserInfos.action")
public DataMessage listUserInfos(Pagination<UserInfo> pageParams) throws Exception {
userInfoService.queryPage(pageParams);
return DataMessage.successData(pageParams);
}
/**
* @functionName: toIndex
* @description: 跳转到初始化页面
* @param
* @author yzh
* @date 2018年8月31日
*/
@RequestMapping(value="/toIndex")
public String toIndex(){
return "index";//返回webapp/WEB-INF/jsp目录下面的index.jsp
}
}
(8)测试
在浏览器的地址栏中输入http://localhost:8088/list/toIndex,可以看到index.jsp被解析的数据信息。
(9)常见异常及解决办法
1)Cannot determine embedded database driver class for database type NONE
原因:
springboot默认是需要datasource的,如果你没有配置datasource就会报上面的错误,因为springboot 启动时会自动注入数据源和配置 jpa
解决办法:
将启动类的@SpringBootApplication注解修改为:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class}),也就是去掉默认的数据源配置。
2)java.io.FileNotFoundException: F:\softwareAll\MavenRepository\xalan\xalan\2.5.1\xml-apis.jar (系统找不到指定的文件。)
出现这个错误时,你会感觉到非常奇怪,因为即便是该jar包不存在,程序照样能够启动,而且在maven本地资源管理库中的目录应该是xalan\xalan\2.5.1,原来springboot默认会启动8.5.2或以上的内置tomcat服务器版本,8.5.2或以上版本的内置tomcat服务器会解析jar中MANIFEST.MF文件,当该文件包含class-path属性时,会把该属性对象值,解析成需要加载的jar给加载进来:
解决办法:
将springboot默认的降版本到8.5.0,如果对springboot内置的tomcat版本进行降级处理呢?
第一步:在标签外添加版本属性及版本号:
<properties>
<tomcat.version>8.5.0</tomcat.version>
</properties>
第二步:加入如下依赖jar包:
<!-- spring-boot的web启动的jar包 -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
重启启动类即可完美运行。
3)工程中有多个main类
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.4.0.RELEASE:repackage (default) on project springbootmongodbdemo: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.4.0.RELEASE:repackage failed: Unable to find a single main class from the following candidates [com.yzh.maven.SpringbootmongodbdemoApplication, com.yzh.maven.base.utils.JacksonUtils, com.yzh.maven.base.utils.StaticMethod] -> [Help 1]
说明:有些开发人员在开发过程中喜欢编写main类金星测试,结果在打包运行时,会报告上面的错误,上面的错误是指com.yzh.maven.SpringbootmongodbdemoApplication, com.yzh.maven.base.utils.JacksonUtils, com.yzh.maven.base.utils.StaticMethod三个类中的都存在main方法,而这个在jar中是不允许的,在springboot程序中,只能保留一个启动类的main方法。
4) 日志jar包冲突
Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.apache.logging.slf4j.Log4jLoggerFactory loaded from jar:file:/C:/Users/Administrator/Desktop/springbootmongodbdemo-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/log4j-slf4j-impl-2.6.2.jar!/). If you are using WebLogic you will need to add ‘org.slf4j’ to prefer-application-packages in WEB-INF/weblogic.xml Object of class [org.apache.logging.slf4j.Log4jLoggerFactory]
说明:这是因为springboot本身就携带了日志jar包,与手动导入的maven依赖jar包产生冲突。解决办法:删除导入的日志org.apache.logging.slf4j jar包或者这样做:
org.springframework.boot
spring-boot-starter-web
1.3.3.RELEASE
org.springframework.boot
spring-boot-starter-logging
(10)打jar包并运行
1)打jar包
2)运行jar包
打开cmd,切换到jar所在的当前目录,输入java –jar jar名,运行程序,在浏览器的地址栏输入首页访问路径,无法访问jsp页面,原来默认情况下,springboot是不支持对webapp/WEB-INF/jsp打包的,我们查看打的jar包的META-INF:
发现在这个目录中没有任何jap文件。那么怎么办呢?我们在‘< build> ’标签中加入下面的标签即可:
<resources>
<!-- 打包时将jsp文件拷贝到META-INF目录下-->
<resource>
<!-- 指定resources插件处理哪个目录下的资源文件 -->
<directory>src/main/webapp</directory>
<!--注意此次必须要放在此目录下才能被访问到-->
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
重新打包完成后就可以通过java -jar xxx.jar命令运行应用了。重新打完包的jsp存放的路径:
附录:
Springboot整合MongoDB完整的pom.xml文件如下所示。
<?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>
<groupId>com.yzh.maven</groupId>
<artifactId>springbootmongodbdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springbootmongodbdemo</name>
<description>Demo project for Spring Boot</description>
<url>http://projects.spring.io/spring-boot/</url>
<!-- 继承父包,此包会添加依赖,spring用到的核心包-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
<relativePath></relativePath>
</parent>
<properties>
<tomcat.version>8.5.0</tomcat.version>
</properties>
<!-- spring-boot的web启动的jar包 -->
<dependencies>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
<!-- web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- servlet 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat 的支持 .-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!-- 集成mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!--日志打印
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.6.2</version>
</dependency> -->
<!-- mybatis分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.2.1</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>struts</groupId>
<artifactId>struts</artifactId>
<version>1.2.9</version>
<exclusions>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- Package as an executable JAR -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<!-- 打包时将jsp文件拷贝到META-INF目录下-->
<resource>
<!-- 指定resources插件处理哪个目录下的资源文件 -->
<directory>src/main/webapp</directory>
<!--注意此次必须要放在此目录下才能被访问到-->
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
<!-- Allow access to Spring milestones and snapshots -->
<!-- (you don't need this if you are using anything after 0.5.0.RELEASE) -->
<repositories>
<repository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
</project>