SpringBoot搭建小型restful服务

    之前接手的一个项目中,用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());

    @Autowired
    private 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包修改太麻烦了。

    只罗列了部分步骤,还有好多细节木有提供,不过网上教程也挺多,个人也比较懒,不再赘述。

posted on 2017-08-19 13:30  止水梵花  阅读(2326)  评论(0编辑  收藏  举报

导航