之前接手的一个项目中,用SpringBoot快速搭建小型的restful服务,很方便,加快了不小的开发效率。
第一次将SpringBoot应用到实际项目中,也踩了不少的坑,作为新人收获不小。
SpringBoot的介绍就不说了,百度很多,复制粘贴过来也没什么意义。
一、环境
构建工具:Maven(怎么用请百度)
JDK:这里使用1.8
IDE:idea
二、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.myspringboot.QuickService</groupId><artifactId>QuickService</artifactId><version>ver_20170811</version><packaging>jar</packaging><name>QuickService</name><description>SpringBoot quick service</description><!-- Inherit defaults from Spring Boot --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version><relativePath/></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring.version>4.3.6.RELEASE</spring.version><start-class>com.myspringboot.QuickService.QuickServiceApplication</start-class><java.version>1.8</java.version></properties><!-- Package as an executable JAR --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>1.5.2.RELEASE</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins><!-- 这里是为了添加自己提供的jar包 --><resources><resource><directory>${basedir}/src/lib</directory><targetPath>BOOT-INF/lib/</targetPath><includes><include>**/*.jar</include></includes></resource><resource><directory>${basedir}/src/main/resources</directory><filtering>true</filtering><includes><include>**/application*.yml</include><include>**/application*.yaml</include><include>**/application*.properties</include></includes></resource><resource><directory>${basedir}/src/main/resources</directory><excludes><exclude>**/application*.yml</exclude><exclude>**/application*.yaml</exclude><exclude>**/application*.properties</exclude></excludes></resource></resources></build><dependencies><!-- 自己提供的jar包,放在了src/lib目录下,根据实际情况而定 --><dependency><groupId>src.lib</groupId><artifactId>alarm</artifactId><version>1.0.0</version><scope>system</scope><systemPath>${project.basedir}/src/lib/xxxx.jar</systemPath></dependency><!-- spring boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--SpringBoot 使用 JDBCTemplate 引用下面这个包才会自动注入--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!-- spring boot --><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.10</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.1</version></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.1</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.2.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-exec</artifactId><version>1.3</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.3.2</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>2.0</version></dependency><dependency><groupId>commons-pool</groupId><artifactId>commons-pool</artifactId><version>1.6</version><!-- ԭ±¾ʹԃµŊű.2°汾 --></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>18.0</version></dependency><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.jvnet.opendmk</groupId><artifactId>jmxremote_optional</artifactId><version>1.0_01-ea</version></dependency><dependency><groupId>javax.management</groupId><artifactId>jmxri</artifactId><version>1.2.1</version><type>pom</type></dependency><dependency><groupId>com.sun.jdmk</groupId><artifactId>jmxtools</artifactId><version>1.2.1</version><type>pom</type></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.3</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.3</version></dependency><dependency><groupId>com.mchange</groupId><artifactId>mchange-commons-java</artifactId><version>0.2.10</version></dependency><dependency><groupId>ojdbc</groupId><artifactId>ojdbc</artifactId><version>6</version></dependency><dependency><groupId>org.fusesource</groupId><artifactId>sigar</artifactId><version>1.6.4</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.12</version></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.2.12</version></dependency><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>2.2.11</version></dependency><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency></dependencies><!-- 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><repository><id>spring-releases</id><url>https://repo.spring.io/libs-release</url></repository></repositories><pluginRepositories><pluginRepository><id>spring-releases</id><url>https://repo.spring.io/libs-release</url></pluginRepository><pluginRepository><id>central</id><name>Maven plugin</name><url>htpp://repo1.maven.org/maven2</url><layout>default</layout><snapshots><enabled>true</enabled></snapshots><releases><enabled>false</enabled></releases></pluginRepository><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>
由于项目需求用到了不少依赖,全贴出来了,根据自己的情况进行调整吧。
三、主要配置
1. QuickServiceApplication.java
1 package com.myspringboot.QuickService; 2 3 import org.apache.commons.dbcp.BasicDataSource; 4 import org.apache.logging.log4j.LogManager; 5 import org.apache.logging.log4j.Logger; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.boot.SpringApplication; 8 import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 9 import org.springframework.context.annotation.Bean; 10 import org.springframework.context.annotation.ComponentScan; 11 import org.springframework.context.annotation.Configuration; 12 import org.springframework.core.env.Environment; 13 14 import javax.sql.DataSource; 15 16 @EnableAutoConfiguration 17 @ComponentScan 18 @Configuration 19 public class QuickServiceApplication { 20 21 public static void main(String[] args) { 22 Logger logger = LogManager.getLogger(QuickServiceApplication.class.getName()); 23 24 25 System.out.println("*****************************************************"); 26 System.out.println("************QuickService***********"); 27 System.out.println("*****************************************************"); 28 29 logger.info("===========>QuickService<==========="); 30 SpringApplication.run(QuickServiceApplication.class, args); 31 32 } 33 34 // 配置数据库源 35 @Autowired 36 private Environment env; 37 38 @Bean 39 public DataSource dataSource() { 40 41 BasicDataSource dataSource = new BasicDataSource(); 42 43 dataSource.setUrl(env.getProperty("spring.datasource.url")); 44 dataSource.setUsername(env.getProperty("spring.datasource.username")); 45 46 // 解密前的数据库密码 47 String desPwd = env.getProperty("spring.datasource.password").trim(); 48 49 System.out.println("username:" + env.getProperty("spring.datasource.username") + 50 ", pwd:" + desPwd + ", url:" + env.getProperty("spring.datasource.url")); 51 52 // 解密数据库密码 53 String password = NLDes.decrypt(desPwd); 54 55 System.out.println("after decrypt, password: " + password); 56 57 dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name")); 58 dataSource.setPassword(password); 59 60 return dataSource; 61 62 } 63 }
注意53行,这是对application.properties文件中数据库的密码进行解密操作,这个根据个人情况修改。
2. Restful风格的服务接口
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.testng.collections.Lists;import java.util.List;/*** 服务接口* */ @RestController public class CloudService {private Logger logger = LogManager.getLogger(CloudService.class.getName());@Autowiredprivate Handler handler;/*** 处理外部http请求,将请求体的Json字符串转化为实体** @return*/@RequestMapping(value = "/fm", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")public List<ResultModel> dealFmRequest(@RequestBody CloudModel cloudModel) {// 处理结果实体List<ResultModel> resultModelList = Lists.newArrayList();.....return resultModelList;}}
加个@RestController注解即可。另外有用到其它类的对象,可用@Autowired注解进行注入,注意的要注入的类必须有@Component注解,否则Spring将无法发现并装载指定的类。
我这边由于需求,需要请求体的json字符串自动转换成实体, 注意字符编码问题以及Json到实体Bean的结构映射问题。
注意,CloudService.java 与 QuickServiceApplication.java处于同一个包内
3. application.properties
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:testdb
spring.datasource.username=mydb
spring.datasource.password=6FD549E05C528370
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
server.port=8181
log4j配置文件与application.properties文件都放在resource文件夹下。
四、启动脚本
提供个启动脚本给各位参考
1 #!/usr/bin/env bash 2 cd /.../QuickService 3 4 UCAGENT=. 5 UCAGENT_CP="." 6 7 for jarfile in $UCAGENT/lib/*.jar; do 8 UCAGENT_CP=$UCAGENT_CP:$jarfile 9 done 10 11 echo $UCAGENT_CP 12 13 java -Xbootclasspath/a:$UCAGENT_CP -jar QuickService.jar --spring.config.location=/..../application.properties > /dev/null & 14 15 echo "start QuickService ok"
第一行指定了jar包所在的路径,13行运行时,用外部application.properties文件覆盖了jar包内部的配置文件,毕竟要打开jar包修改太麻烦了。
只罗列了部分步骤,还有好多细节木有提供,不过网上教程也挺多,个人也比较懒,不再赘述。