昨天学完了springboot,感觉没什么困难,好多东西都是spring简化来的,今天于是就上手将自己之前写过的一个spring项目进行改进,改进到springboot项目,没想到还是遇到各种突发bug。哎,还是写一些,让后人少采坑吧。
注意:我的maven编译是jdk1.8,注意修改!!详情戳:https://blog.youkuaiyun.com/yinweicheng/article/details/80902381
改之前的项目:许木木/marketdemo
修改之后的项目:许木木/springboot
第一步,创建mvaen项目(war包,由于之前的demo有大量jsp,先打成war项目),引入依赖:
--------------------------补更---------------------------
springboot各模块的功能:
spring-boot-maven-plugin:如果我们要直接Main启动spring,那么以下plugin必须要添加,否则是无法启动的。如果使用maven 的spring-boot:run的话是不需要此配置的。(测试时如果不配置下面的plugin也是直接在Main中运行的。)
spring-boot-maven-parent:提供springboot的maven编译插件,包含spring-boot-maven-plugin,并提供了版本管理:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
spring-boot-starter-web:springweb核心组件,包括springmvc;
也就是说,我们既可以自己做依赖管理,也可以通过继承spring-boot-starter-parent做版本控制
-------------------------补更完----------------------
<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>edu.hrbeu</groupId>
<artifactId>springboot-jsp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<springboot.version>2.0.1.RELEASE</springboot.version>
<tomcat.version>8.5.29</tomcat.version>
<mybatis.version>1.3.1</mybatis.version>
<mysqlConnector.version>5.1.26</mysqlConnector.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${springboot.version}</version>
</dependency>
<!-- jsp -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>${springboot.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${springboot.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- 标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- jstl -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysqlConnector.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- jstl -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build />
</project>
第二步,拷贝项目,注意mapper映射的xml文件放到resource中!!!!
第三步:编辑application.yml,引入数据源,mybatis配置,以及jsp视图控制
server:
port: 8080
spring:
datasource:
name: test
url: jdbc:mysql://127.0.0.1:3306/csgl
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
max-active: 20
max-wait: 60000
min-idle: 1
mvc:
view:
suffix: .jsp
prefix: /WEB-INF/jsp/
mybatis:
#类型别名,实体类位置
type-aliases-package: edu.hrbeu.po
#映射文件位置
mapper-locations: classpath:edu/hrbeu/mapper/*.xml
接下来便是修改代码了,先将mapper.xml中的报名进行修改,在对dao层的接口进行修改。在每个dao层的接口上加上注解:
再对service层进行修改,在serviceimpl中对dao层的调用有两种方式:
1.直接调用mapper接口:
package edu.hrbeu.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import edu.hrbeu.dao.CustomerMapper;
import edu.hrbeu.po.Customer;
import edu.hrbeu.service.CustomerService;
@Service("CustomerService")
public class CustomerServiceImpl implements CustomerService {
@Autowired
private CustomerMapper customerMapper;
@Override
public Customer selectByPrimaryKey(String phone) {
// TODO Auto-generated method stub
return customerMapper.selectByPrimaryKey(phone);
}
.......
}
2.还有一种就是我们熟悉的sqlsessiontemplate
package edu.hrbeu.service.impl;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import edu.hrbeu.dao.GoodsMapper;
import edu.hrbeu.po.Goods;
import edu.hrbeu.service.GoodsService;
@Service("GoodsService")
public class GoodsServiceImpl implements GoodsService{
@Autowired
private SqlSessionTemplate sqlSession;
@Override
public int deleteByPrimaryKey(Integer id) {
// TODO Auto-generated method stub
return sqlSession.getMapper(GoodsMapper.class).deleteByPrimaryKey(id);
}
......
}
修改完成之后将我们的jsp页面拷贝到相应路径:
好了,现在加入我们的启动类:
package edu.hrbeu.app;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@ComponentScan(basePackages = "edu.hrbeu.*")//组件扫描器
@MapperScan(basePackages="edu.hrbeu.dao")//映射扫描器
@EnableAutoConfiguration
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
大体修改完毕,现在正片开始!!!bug即将登场!!!
1.启动时遇到:
java.lang.NoSuchMethodError: org.apache.tomcat.JarScanner.scan(Ljavax/servlet/ServletContext;Ljava/lang/ClassLoader;Lorg/apache/tomcat/JarScannerCallback;Ljava/util/Set;)V
at org.apache.jasper.compiler.TldLocationsCache.init(TldLocationsCache.java:245) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.compiler.TldLocationsCache.getLocation(TldLocationsCache.java:205) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.JspCompilationContext.getTldLocation(JspCompilationContext.java:607) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:409) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:475) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1427) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.compiler.Parser.parse(Parser.java:138) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:242) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:102) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:198) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:373) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) ~[tomcat-embed-jasper-7.0.47.jar:7.0.47]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.29.jar:8.5.29]
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728) [tomcat-embed-core-8.5.29.jar:8.5.29]
... ...
出现这个问题是因为我们的依赖产生了矛盾,也就是说项目所需要的tomcat-embed-core版本为8.5.29,而你引入的版本低,达不到要求,所以出现异常。只要我们修改一下版本就行。
2.访问请求时遇到:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): edu.hrbeu.dao.LoginMapper.selectByPrimaryKey
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:225) ~[mybatis-3.4.5.jar:3.4.5]
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48) ~[mybatis-3.4.5.jar:3.4.5]
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65) ~[mybatis-3.4.5.jar:3.4.5]
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58) ~[mybatis-3.4.5.jar:3.4.5]
at com.sun.proxy.$Proxy68.selectByPrimaryKey(Unknown Source) ~[na:na]
at edu.hrbeu.service.impl.LoginServiceImpl.selectByPrimaryKey(LoginServiceImpl.java:18) ~[classes/:na]
at edu.hrbeu.control.LoginController.Login(LoginController.java:29) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_141]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_141]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_141]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_141]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
... ...
出现这种问题有两种情况:
1. dao层中的mapper映射接口上没有加@Mapper注解
2.mapper-location的路径不对,或者xml文件中的属性映射的类和映射文件相关的路径不对
3.启动时遇到
Consider defining a bean of type 'edu.hrbeu.dao.CustomerMapper' in your configuration.
原因:启动类没有加映射扫描。
4.启动时遇到
Consider defining a bean of type 'edu.hrbeu.dao.CustomerMapper' in your configuration
原因:type-aliases-package别名写错了。。。。
5.访问请求时又遇到:
Type interface com.mybatis.mapper.UserMapper is not known to the MapperRegistry
原因:mapper扫描的包路径配置错误,,,,,
---------------------------------------补更------------------------------------------------
6.直接跳转jsp报404错误
原因:springMVC的视图控制器对所有请求进行了拦截,由于没有配置web.xml文件,所以对“*.jsp”进行统一拦截。
package edu.hrbeu.control;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Controller
public class JspController {
//对“*-jsp”进行同意拦截,之后再返回到相应的*.jsp界面
@RequestMapping(value="/{name}-jsp")
public String jsp(@PathVariable String name){
return name;
}
}