美文网首页日更达人联盟
基于SpringBoot 的rest接口开发流程

基于SpringBoot 的rest接口开发流程

作者: 清_晨_ | 来源:发表于2018-12-06 22:58 被阅读53次

    项目中用到接口开发,所以记录一下,方便以后使用。
    本教程主要分为三个部分:
    1.利用geneator自动生成相关实体及mapper.xml,相关教程可参考之前写的Spring Boot 集成Mybatis Generator和通用Mapper自动生成代码;
    2.书写rest接口,包括相关校验;
    3.配置druid数据源;

    1.完整的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.geneator.test</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>demo</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.10.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-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!-- 打war包 依赖tomcat api -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </dependency>
    
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.4</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.1.0</version>
            </dependency>
           <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.8</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.45</version>
            </dependency>
            <dependency>
                <groupId>com.oracle</groupId>
                <artifactId>ojdbc6</artifactId>
                <version>11.2.0.1.0</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/log4j/log4j -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
    
            <!--mybatis-generator包-->
            <dependency>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-core</artifactId>
                <version>1.3.5</version>
            </dependency>
            <dependency>
                <groupId>javax.persistence</groupId>
                <artifactId>persistence-api</artifactId>
                <version>1.0</version>
            </dependency>
            <!-- 通用 Mapper -->
            <dependency>
                <groupId>tk.mybatis</groupId>
                <artifactId>mapper-spring-boot-starter</artifactId>
                <version>2.0.4</version>
            </dependency>
            <dependency>
                <groupId>tk.mybatis</groupId>
                <artifactId>mapper</artifactId>
                <version>4.0.4</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.js</include>
                    </includes>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*</include>
                    </includes>
                </resource>
    
            </resources>
            <plugins>
                <!--mybatis 自动生成dao,model,mapper,generaotr插件-->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
    
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.3.2</version>
    
                    <dependencies>
                        <dependency>
                            <groupId>tk.mybatis</groupId>
                            <artifactId>mapper</artifactId>
                            <version>4.0.4</version>
                        </dependency>
                        <dependency>
                            <groupId>com.oracle</groupId>
                            <artifactId>ojdbc6</artifactId>
                            <version>11.2.0.1.0</version>
                        </dependency>
                    </dependencies>
                    <configuration>
                        <configurationFile>
                            ${basedir}/src/main/resources/generatorConfig.xml
                        </configurationFile>
                        <verbose>true</verbose>
                        <overwrite>true</overwrite>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    2.利用geneator自动生成mapper接口的配置如下,这里使用通用mapper来生成代码。

    1.geneatorConfig.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
        <!--引入配置文件-->
        <properties resource="db-config.properties"></properties>
        <!-- 引入数据库驱动 -->
        <classPathEntry location="${jdbc.driverClassLocation}"/>
        <context id="baseset" targetRuntime="MyBatis3" defaultModelType="flat">
            <property name="javaFileEncoding" value="UTF-8"/>
            <property name="useMapperCommentGenerator" value="true"/>
            <!-- 通用mapper插件 -->
            <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
                <!-- 此处的 MyMapper注意一定不能被扫描到-->
                <property name="mappers" value="${generator.mappers}"/>
                <!-- caseSensitive 是否区分大小写,默认值 false。如果数据库区分大小写,这里就需要配置为 true,这样当表名为 USER 时,
                 会生成 @Table(name = "USER") 注解,否则使用小写 user 时会找不到表。-->
                <property name="caseSensitive" value="true"/>
                <!--forceAnnotation 是否强制生成注解,默认 false,如果设置为 true,不管数据库名和字段名是否一致,都会生成注解(包含 @Table 和 @Column)。-->
                <property name="forceAnnotation" value="true"/>
            </plugin>
            <commentGenerator>
                <property name="suppressDate" value="true"/><!-- 是否生成注释代时间戳-->
                <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
            </commentGenerator>
            <jdbcConnection
                    driverClass="${jdbc.driverClass}"
                    connectionURL="${jdbc.connectionURL}"
                    userId="${jdbc.username}"
                    password="${jdbc.password}">
            </jdbcConnection>
    
            <javaModelGenerator targetPackage="${generator.javaModel-targetPackage}" targetProject="${generator.targetProject}"/>
            <sqlMapGenerator targetPackage="${generator.sqlMap-targetPackage}" targetProject="${generator.targetProject}"/>
            <javaClientGenerator targetPackage="${generator.javaClient-targetPackage}" targetProject="${generator.targetProject}"
                                 type="XMLMAPPER"/>
    
            <!--数据库中对应的表名,多个表可以写多个tableName-->
    
            <table tableName="t_person_base_info"
                   enableInsert="false"  enableUpdateByPrimaryKey="false"
                   enableDeleteByExample="false" enableSelectByExample="false"
                   selectByExampleQueryId="false">
                <generatedKey column="c_id" sqlStatement="select SEQ_{1}.nextval from dual" identity="false" type="pre"/>
            </table>
    
        </context>
    </generatorConfiguration>
    
    
    2.db-config.properties
    #jdbc 连接对象
    #oracle jar文件位置
    jdbc.driverClassLocation=D:/tools/ojdbc6-11.2.0.1.0.jar
    jdbc.driverClass=oracle.jdbc.OracleDriver
    jdbc.connectionURL=jdbc:oracle:thin:@localhost:1521:orcl
    jdbc.username=system
    jdbc.password=123456
    
    # Generator
    generator.targetProject=src/main/java
    generator.mappers=tk.mybatis.mapper.common.BaseMapper
    #generator.mappers=com.geneator.test.demo.mapper.IBaseMapper
    generator.javaModel-targetPackage=com.geneator.test.demo.bean
    generator.sqlMap-targetPackage=com.geneator.test.demo.xml
    generator.javaClient-targetPackage=com.geneator.test.demo.mapper
    
    3.生成的实体
    package com.geneator.test.demo.bean;
    
    import java.util.Date;
    import javax.persistence.*;
    
    @Table(name = "T_PERSON_BASE_INFO")
    public class TPersonBaseInfo {
        @Id
        @Column(name = "C_ID")
        @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "select SEQ_T_PERSON_BASE_INFO.nextval from dual")
        private String cId;
    
        @Column(name = "HEALTH_RECORD_CODE")
        private String healthRecordCode;
    
        @Column(name = "ORG_CODE")
        private String orgCode;
    
        @Column(name = "FAMILY_CODE")
        private String familyCode;
    
        @Column(name = "NAME")
        private String name;
    
        @Column(name = "SEX")
        private String sex;
    
        @Column(name = "BIRTHDAY")
        private Date birthday;
    
        @Column(name = "ID_NO")
        private String idNo;
    
        @Column(name = "INSURANCE_NO")
        private String insuranceNo;
    
        @Column(name = "SOCIAL_RELATIONS")
        private String socialRelations;
    
        @Column(name = "TOWNS")
        private String towns;
    
        @Column(name = "NC_CODE")
        private String ncCode;
    
     //省略中间代码
    
        /**
         * @param sourceflag
         */
        public void setSourceflag(String sourceflag) {
            this.sourceflag = sourceflag;
        }
    }
    
    4.生成的mapper接口
    package com.geneator.test.demo.mapper;
    
    import com.geneator.test.demo.bean.TPersonBaseInfo;
    import com.geneator.test.demo.bean.TPersonBaseInfoExample;
    import org.apache.ibatis.annotations.Param;
    import org.springframework.stereotype.Repository;
    import tk.mybatis.mapper.common.BaseMapper;
    import tk.mybatis.mapper.common.Mapper;
    
    import java.util.List;
    import java.util.Map;
    
    @org.apache.ibatis.annotations.Mapper
    @Repository
    public interface TPersonBaseInfoMapper extends Mapper<TPersonBaseInfo> {
        List<Map<String, String>> query(String var1);
    
        Integer getCountByCid(String var1);
     
    }
    
    5.mapper.xml
    
        <!-- 查询部分信息,注意:默认情况下,当resultType=“java.util.Map”时,返回的key值都是大写的。-->
        <!-- 现在想key改成自己想要的,只需为查询出来的字段增加个别名即可。as 后的双引号很关键,否则不起作用。-->
        <select id="query" parameterType="string" resultType="java.util.Map">
        select a.c_id as "cId", b.orgnamepath as "orgnamepath", a.emigration as "emigration" from t_person_base_info a, taorg b
        where a.org_code = b.costomno and a.id_no = #{idNo} and b.destory is null and a.cancel_flag = '0'
      </select>
        <!-- 通过主键查询数据库里面是否有数据,并返回统计结果。-->
        <select id="getCountByCid" parameterType="string" resultType="int">
        select count(*) from t_person_base_info where c_id = #{cId}
      </select>
    
    </mapper>
    

    3.书写业务层,控制层。

    1.service
    package com.geneator.test.demo.service;
    
    public interface TestService {
        String invoke (String req);
    }
    
    2.实现类
    package com.geneator.test.demo.service.impl;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    import com.geneator.test.demo.bean.Rest;
    import com.geneator.test.demo.service.TestService;
    import com.geneator.test.demo.trade.TradeStrategy;
    import com.geneator.test.demo.util.ErrorUtil;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    import org.springframework.stereotype.Service;
    import org.springframework.util.StringUtils;
    
    @Service("testService")
    public class TestServiceImpl implements TestService,ApplicationContextAware {
    
        private static final Logger log = LoggerFactory.getLogger("testService");
        private static ApplicationContext context;
        public TestServiceImpl(){
    
        }
    
    
        @Override
        public String invoke(String req) {
            try {
                Rest checkRest = this.checkJson(req);
               if("0".equals(checkRest.getErrorCode())){
                   return JSON.toJSONString(checkRest, new SerializerFeature[]{SerializerFeature.WriteMapNullValue});
               }else{
                   JSONObject json = JSONObject.parseObject(req);
                   JSONObject head = json.getJSONObject("head");
                   String code = head.getString("code");
                   TradeStrategy strategy = getStrategy(code);
                   if (strategy == null) {
                       return JSONObject.toJSONString(ErrorUtil.getErrorInfo("004"), new SerializerFeature[]{SerializerFeature.WriteMapNullValue});
                   } else {
                       Rest result = strategy.call(code, json);
                       return JSON.toJSONString(result, new SerializerFeature[]{SerializerFeature.WriteMapNullValue});
                   }
               }
            } catch (Exception var8) {
                var8.printStackTrace();
                return JSONObject.toJSONString(ErrorUtil.getErrorInfo("9999"), new SerializerFeature[]{SerializerFeature.WriteMapNullValue});
            }
    
        }
        public Rest checkJson(String req){
            JSONObject json = null;
          try {
              json =  JSONObject.parseObject(req);
            }catch(Exception var9){
          log.error("请求的参数格式不为一个json!");
          return ErrorUtil.getErrorInfo("001");
           }
            JSONObject head = null;
            System.out.println(json.toJSONString());
            String version;
            try {
                version = json.getString("head").trim();
                head = JSONObject.parseObject(version);
                if (head == null) {
                    return ErrorUtil.getErrorInfo("010");
                }
            }catch (Exception var8) {
                log.error("请求的参数head格式不为一个json!");
                return ErrorUtil.getErrorInfo("010");
            }
            version = head.getString("version");
    
            if (!"1.0.0".equals(version)){
                return ErrorUtil.getErrorInfo("011");
            }else {
                String code = null;
                try {
                    code = head.getString("code");
                    if(StringUtils.isEmpty(code)){
                        return ErrorUtil.getErrorInfo("003");
                    }
                }catch (Exception var11) {
                    return ErrorUtil.getErrorInfo("003");
                }
            }
            JSONObject body = null;
            try {
                String bodyText = json.getString("body").trim();
                body = JSONObject.parseObject(bodyText);
                if (body == null) {
                    return ErrorUtil.getErrorInfo("002");
                }
            }catch (Exception var10) {
                log.error("请求的参数格式不为一个json!" + json.getString("body"));
                return ErrorUtil.getErrorInfo("002");
            }
            return ErrorUtil.getCheckSuccess();
        }
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            context = applicationContext;
        }
        public static TradeStrategy getStrategy(String code) {
            TradeStrategy strategy = null;
    
            try {
                strategy = (TradeStrategy)context.getBean("tradeStrategy" + code);
            } catch (Exception var3) {
                log.error("找不到" + code + "对应的策略类。。");
            }
    
            return strategy;
        }
    }
    
    3.交易类
    package com.geneator.test.demo.trade;
    
    import com.alibaba.fastjson.JSONObject;
    import com.geneator.test.demo.bean.Rest;
    
    public interface TradeStrategy {
        Rest call(String var1, JSONObject var2);
        Rest checkJSON(JSONObject var1, String var2);
    }
    
    4.交易实现类
    package com.geneator.test.demo.trade.impl;
    
    import com.alibaba.fastjson.JSONObject;
    import com.geneator.test.demo.bean.Rest;
    import com.geneator.test.demo.mapper.TPersonBaseInfoMapper;
    import com.geneator.test.demo.trade.TradeStrategy;
    import com.geneator.test.demo.util.ErrorUtil;
    import com.geneator.test.demo.util.IDCardUtil;
    import com.geneator.test.demo.validate.ValidateBody;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    import java.util.Map;
    
    @Service("tradeStrategy0200")
    public class TradeStrategy0200 implements TradeStrategy {
        @Autowired
        TPersonBaseInfoMapper tPersonBaseInfoMapper;
        public TradeStrategy0200() {
        }
    
        @Override
        public Rest call(String code, JSONObject json) {
            try {
                return this.exec(code, json);
            } catch (Exception var6) {
                String errMsg = var6.getMessage();
                if (errMsg == null) {
                    errMsg = "JSON 数据转换为 JavaBean 出现异常,请检查数据格式是否正确。如有些本应该是 int 类型的,但却传入了 string 类型。";
                }
    
                Rest rest = new Rest();
                rest.setErrorCode("0");
                rest.setMessage("程序异常错误!错误信息为:" + errMsg);
                return rest;
            }
    
        }
    
        @Override
        public Rest checkJSON(JSONObject json, String code) {
            System.out.println(json.toJSONString());
            Rest rest = ValidateBody.validate(json, code);
            return rest;
        }
    
        private Rest exec(String code, JSONObject json)throws Exception {
            JSONObject body = json.getJSONObject("body");
            Rest rest =  this.checkJSON(body, code);
            if("0".equals(rest.getErrorCode())){
                return  rest;
            } else {
                    String idNo = body.getString("idNo");
                    if (idNo != null && !IDCardUtil.isIDCard(idNo)) {
                    rest = ErrorUtil.getErrorInfo("1002-2");
                    return rest;
                     } else {
                            List<Map<String, String>> list = this.tPersonBaseInfoMapper.query(idNo);
                            rest.setBody(list);
                            return rest;
                }
            }
        }
    }
    

    接口中相关校验代码,由于代码比较长,在此省略。

    5.书写controller类
    package com.geneator.test.demo.controller;
    
    import com.geneator.test.demo.service.TestService;
    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.RestController;
    
    @RestController
    @RequestMapping({"/api"})
    public class TestController {
        @Autowired
        TestService testService;
        public  TestController(){
    
        }
        @RequestMapping({"/invoke"})
        public String invoke(@RequestBody String req) {
            return this.testService.invoke(req);
        }
    }
    

    4.配置druid数据源

    1.DruidConfig
    package com.geneator.test.demo.config;
    
    import com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.boot.web.servlet.ServletComponentScan;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ServletComponentScan
    public class DruidConfig {
        public DruidConfig() {
        }
        @Bean
        public ServletRegistrationBean druidServlet() {
           // ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), new String[]{"/druid/*"});
            ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
    
            servletRegistrationBean.setServlet(new StatViewServlet());
            servletRegistrationBean.addUrlMappings(new String[]{"/druid/*"});
            servletRegistrationBean.addInitParameter("allow","127.0.0.1");
            servletRegistrationBean.addInitParameter("loginUsername", "admin");
            servletRegistrationBean.addInitParameter("loginPassword", "123456");
           //允许HTML页面上的“Reset All”功能
            servletRegistrationBean.addInitParameter("resetEnable", "false");
            return servletRegistrationBean;
        }
    
        @Bean
        public FilterRegistrationBean filterRegistrationBean() {
    
           // FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter(), new ServletRegistrationBean[0]);
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
            filterRegistrationBean.setFilter(new WebStatFilter());
            filterRegistrationBean.addUrlPatterns(new String[]{"/*"});
            filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
            filterRegistrationBean.addInitParameter("profileEnable", "true");
            return filterRegistrationBean;
        }
    }
    
    2.DruidSource
    package com.geneator.test.demo.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    import javax.sql.DataSource;
    import java.sql.SQLException;
    
    @Configuration
    public class DruidSource {
        private Logger logger = LoggerFactory.getLogger(this.getClass());
        @Value("${spring.datasource.url}")
        private String dbUrl;
        @Value("${spring.datasource.username}")
        private String username;
        @Value("${spring.datasource.password}")
        private String password;
        @Value("${spring.datasource.driver-class-name}")
        private String driverClassName;
        @Value("${spring.datasource.initialSize}")
        private int initialSize;
        @Value("${spring.datasource.minIdle}")
        private int minIdle;
        @Value("${spring.datasource.maxActive}")
        private int maxActive;
        @Value("${spring.datasource.maxWait}")
        private int maxWait;
        @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
        private int timeBetweenEvictionRunsMillis;
        @Value("${spring.datasource.minEvictableIdleTimeMillis}")
        private int minEvictableIdleTimeMillis;
        @Value("${spring.datasource.validationQuery}")
        private String validationQuery;
        @Value("${spring.datasource.testWhileIdle}")
        private boolean testWhileIdle;
        @Value("${spring.datasource.testOnBorrow}")
        private boolean testOnBorrow;
        @Value("${spring.datasource.testOnReturn}")
        private boolean testOnReturn;
        @Value("${spring.datasource.poolPreparedStatements}")
        private boolean poolPreparedStatements;
        @Value("${spring.datasource.filters}")
        private String filters;
    
        public DruidSource() {}
        @Bean
        @Primary
        public DataSource druidDataSource() {
            DruidDataSource datasource = new DruidDataSource();
            datasource.setUrl(this.dbUrl);
            datasource.setUsername(this.username);
            datasource.setPassword(this.password);
            datasource.setDriverClassName(this.driverClassName);
            datasource.setInitialSize(this.initialSize);
            datasource.setMinIdle(this.minIdle);
            datasource.setMaxActive(this.maxActive);
            datasource.setMaxWait((long)this.maxWait);
            datasource.setTimeBetweenEvictionRunsMillis((long)this.timeBetweenEvictionRunsMillis);
            datasource.setMinEvictableIdleTimeMillis((long)this.minEvictableIdleTimeMillis);
            datasource.setValidationQuery(this.validationQuery);
            datasource.setTestWhileIdle(this.testWhileIdle);
            datasource.setTestOnBorrow(this.testOnBorrow);
            datasource.setTestOnReturn(this.testOnReturn);
            datasource.setPoolPreparedStatements(this.poolPreparedStatements);
    
            try {
                datasource.setFilters(this.filters);
            } catch (SQLException var3) {
                this.logger.error("druid configuration initialization filter", var3);
            }
    
            return datasource;
        }
    
        @Bean
        @Primary
        public DataSourceTransactionManager masterTransactionManager() throws SQLException {
            return new DataSourceTransactionManager(this.druidDataSource());
        }
    }
    
    3.WebCorsConfigurerAdapter
    package com.geneator.test.demo.config;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.CorsRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    
    @Configuration
    public class WebCorsConfigurerAdapter extends WebMvcConfigurerAdapter {
        @Value("${cors.allowedOrigins}")
        private String[] allowedOrigins;
    
        public WebCorsConfigurerAdapter() {
        }
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/api/**").allowedOrigins(this.allowedOrigins).allowedHeaders(new String[]{"*"}).allowedMethods(new String[]{"POST"});
        }
    }
    

    5.相关配置文件如下:

    1.application
    mybatis.config-location=classpath:mybatis-config.xml
    mybatis.mapper-locations=classpath*:com/geneator/**/*Mapper.xml
    #实体类包名
    mybatis.typeAliasesPackage=com.geneator.test.demo.bean
    mapper.before=true
    mapper.b-e-f-o-r-e=true
    
    cors.allowedOrigins = http://127.0.0.1:8881/jkda,http://127.0.0.1:8881/asd
    
    
    ##########################  oracle   ##########################
    spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
    spring.datasource.username=system
    spring.datasource.password=123456
    spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
    
    logging.level.com.geneator.test.demo.mapper=info
    logging.level.com.geneator.test.demo.trade=info
    logging.file=log\testInterface.log
    logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n
    
    
    ##########################  druid\u914D\u7F6E   ##########################
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.initialSize=5
    spring.datasource.minIdle=5
    spring.datasource.maxActive=40
    spring.datasource.maxWait=60000
    spring.datasource.timeBetweenEvictionRunsMillis=60000
    spring.datasource.minEvictableIdleTimeMillis=300000
    spring.datasource.validationQuery=SELECT 1 FROM DUAL
    spring.datasource.testWhileIdle=true
    spring.datasource.testOnBorrow=false
    spring.datasource.testOnReturn=false
    spring.datasource.poolPreparedStatements=true
    spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
    spring.datasource.filters=stat,wall,log4j
    spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    spring.datasource.useGlobalDataSourceStat=true
    
    
    spring.http.encoding.charset=UTF-8
    spring.http.encoding.force=true
    spring.http.encoding.enabled=true
    
    2.DemoApplication
    package com.geneator.test.demo;
    
    import org.apache.ibatis.annotations.Mapper;
    import org.mybatis.spring.annotation.MapperScan;
    
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    import org.springframework.boot.builder.SpringApplicationBuilder;
    
    import org.springframework.boot.web.support.SpringBootServletInitializer;
    
    @SpringBootApplication
    @MapperScan(
            basePackages = {"com.geneator.test.demo"},
            annotationClass = Mapper.class)
    
    public class DemoApplication extends SpringBootServletInitializer {
        public DemoApplication() {
        }
        public static void main(String[] args) {
            (new SpringApplicationBuilder(new Object[]{DemoApplication.class})).web(true).run(args);
        }
    
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            SpringApplicationBuilder rest = builder.sources(new Class[]{DemoApplication.class});
            return rest;
        }
    }
    
    

    最后用postman进行测试

    postman

    地址栏输入:http://localhost:8080/druid/login.html,查看druid数据源

    相关文章

      网友评论

        本文标题:基于SpringBoot 的rest接口开发流程

        本文链接:https://www.haomeiwen.com/subject/vgeacqtx.html