通用技术 [spring boot][mongoDB] 搭建 REST 服务

bauul · 2017年11月21日 · 最后由 bauul 回复于 2017年11月22日 · 1436 次阅读

基础工具

  1. spring boot
  2. maven
  3. mongoDB

目标

  1. 了解 mongodb 的查询语句
  2. 了解 spring boot 及 mongodb 的配置并使用

搭建的目的

移动端记录了用户对 APP 的操作行为并会上报至服务端且会持久化,需要对这些信息作校验,
所以搭建这个服务用来查询数据库,在使用 UI 测试工具在 APP 端测试时,并检查服务端是否有对应的行为记录

pom 依赖

<?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.jolly</groupId>
    <artifactId>mobile-test-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>mobile-test-service</name>
    <description>Mobile Test Service for Jolly</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator-docs</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jooq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

prop 配置

spring.data.mongodb.database=countly
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG

配置数据源并开启 mongo 日志,方便查看实际执行的查询语句

bean

@Data
@Document(collection = "logs5729aa86ff5812096852d481")
public class EventMongo {

    @Id
    private String id;
    private String ts;
    private String reqts;
    private String d;
    private String l;
    private String v;
    private String t;
    private String i;
    private String s;
    private String c;

    public EventMongo() {

    }

}

这里 collection 是 mongoDB 的表名

接口配置

public interface EventMapperMongo extends MongoRepository<EventMongo, String> {

    /**
     * 通过DeviceId查找到对应的事件
     * @param deviceId
     * @param startTime
     * @param endTime
     * @return
     */
    @Query("{'d.id':?#{[0]}, 't':'event', 'i.timestamp':{$gt:?#{[1]}, $lt:?#{[2]}}}")
    public List<EventMongo> findAllByQuery(String deviceId, long startTime, long endTime);
}

和 mysql 不一样,不是使用 Select,而是 Query,然后取值,“?#{[0]}” 这个表示取第一个参数,这里是 deviceId

具体实现

@RestController
@RequestMapping("/mongoEvent")
@Slf4j
public class EventControllerMongo {

    @Autowired
    private EventMapperMongo eventMapperMongo;

    @RequestMapping(method = RequestMethod.GET, value = "/deviceId/{deviceId}/startTime/{startTime}/endTime/{endTime}")
    public List<EventMongo> getEvents(@PathVariable("deviceId") String deviceId, @PathVariable("startTime") long startTime, @PathVariable("endTime") long endTime) {
        return eventMapperMongo.findAllByQuery(deviceId, startTime, endTime);
    }

}

log 输出

2017-11-21 22:54:06.378 DEBUG 41848 --- [nio-9980-exec-1] o.s.data.mongodb.core.MongoTemplate      : find using query: { "d.id" : "c7bed21e-f1fa-4241-9b80-85943f6dcd33" , "t" : "event" , "i.timestamp" : { "$gt" : 1511253238 , "$lt" : 1511253318}} fields: null for class: class com.jolly.mobiletestservice.beans.EventMongo in collection: logs5729aa86ff5812096852d481

mongo 查询语句

db.getCollection('logs5729aa86ff5812096852d481').find({ "d.id" : "c7bed21e-f1fa-4241-9b80-85943f6dcd33" , "t" : "event" , "i.timestamp" : { "$gt" : 1511249952 , "$lt" : 1511259269}})

更多学习参考

https://docs.spring.io/spring-data/mongodb/docs/current/reference/html

我的猜测

因为记录了用户的行为,所以它也是日后用户行为分析的基础,但具体怎么玩,还不清楚

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 9 条回复 时间 点赞

哈哈!难得找到一个志同道合的朋友!

Alpha 回复

☺
哈哈,我什么也不会,多多指教啊

最近也在学 spring boot,作者有什么别的测试相关的项目可供参考的。

楼主啥时候来杭州了呀😛

reviewtiger 回复

三周了😊

没有噢,我也是自学的,看你的需求吧,把需求先定义清楚,就有实现的目标了

测 spring boot 的话可以看我会慢慢更新的 RF 的帖子,或者用 pact 测契约,具体看你要测啥

#5 楼 @carl 来杭州了?😉啥时候有空聚聚

—— 来自 TesterHome 官方 安卓客户端

CC 回复

这个周末就可以😈

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册