转载

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

来开始搭建springCloud的客户端client服务。

首先,也是从在线生成了springboot项目。

在线网址:start.spring.io/

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

下载下来的是一个压缩包,解压之后,用编译器IDEA打开这个服务。

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus
因为,我是一次性搭建了spingCloud+eureka+swagger+mybatisPlus,所以这次的话,我就一次性给大家展示一下。

也由于这次的话,不仅仅是局限于这三个配置文件,我还要新增一些配置文件,所以我先把已经搭建成功了的服务的目录给大家看一下:

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

首先是pom.xml文件:

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

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

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

		<!--引入mybatis依赖-->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.2.0</version>
		</dependency>
		<!--引入mybatisPlus依赖-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatisplus-spring-boot-starter</artifactId>
			<version>1.0.5</version>
		</dependency>
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus</artifactId>
			<version>2.1.8</version>
		</dependency>
		<!-- 模板引擎 代码生成 -->
		<dependency>
			<groupId>org.apache.velocity</groupId>
			<artifactId>velocity</artifactId>
			<version>1.7</version>
		</dependency>

		<!--  mysql驱动器依赖-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.6</version>
		</dependency>

		<!--springboot的web依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!--Herbnate实体依赖-->
		<dependency>
			<groupId>javax.persistence</groupId>
			<artifactId>persistence-api</artifactId>
			<version>1.0.2</version>
		</dependency>

		<!-- redis依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>
		<!-- 引入Lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>

		<!--springCloud启动依赖-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter</artifactId>
		</dependency>

		<!--srpingCloud的eureka服务依赖-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>

		<!--srpingCloud的eureka服务注册依赖-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
			<version>2.0.0.RELEASE</version>
		</dependency>

		<!--新增依赖,swaggerUI-->
		<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>


		<!-- alibaba fastjson 格式化对 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.1.41</version>
		</dependency>

		<!-- jwt认证协议依赖 -->
		<dependency>
			<groupId>io.jsonwebtoken</groupId>
			<artifactId>jjwt</artifactId>
			<version>0.9.0</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-hystrix</artifactId>
		</dependency>
		<dependency>
			<groupId>com.netflix.hystrix</groupId>
			<artifactId>hystrix-javanica</artifactId>
		</dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
	</dependencies>

	<!-- 引入spring cloud的依赖,不能少,主要用来管理Spring Cloud生态各组件的版本 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Edgware.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

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

		<resources>
			<resource>
				<!--需要打包的目录-->
				<directory>src/main/resources</directory>
				<!--目录中的文件类型-->
				<includes>
					<include>**/*.xml</include>
					<include>**/*.properties</include>
				</includes>
			</resource>
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<include>**/*.properties</include>
					<include>**/*.xml</include>
				</includes>
				<filtering>false</filtering>
			</resource>
		</resources>

	</build>
复制代码

这个pom文件里面,还有redis的依赖,这个是我后续会加进去的,但是现阶段还没有加进去。

application.properties文件

#服务名
spring.application.name=permission
#端口
server.port=2222
################################################################################################################
#数据库信息
spring.datasource.url: jdbc:mysql://localhost:3306/myblog?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username: root
spring.datasource.password: 123456(请填入你的数据库密码)
spring.datasource.driver-class-name: com.mysql.jdbc.Driver
#################################################################################################################
spring.jmx.default-domain=${spring.application.name}
spring.jpa.open-in-view=false
# springframework.web日志以DEBUG级别输出
logging.level.org.springframework.web=info
###############################################################################################################
# 如果是放在src/main/java目录下 classpath:/com/blog/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
mybatis-plus.type-aliases-package=com.blog.*.entity
#驼峰下划线转换
mybatis-plus.global-config.db-column-underline=true
#刷新mapper 调试神器
mybatis-plus.global-config.refresh-mapper=false
#数据库大写下划线转换
mybatis-plus.global-config.capital-mode=true
#################################################################################################################
#配置Swagger相关信息(从eureka跳到swagger页面)
eureka.instance.prefer-ip-address=true
eureka.instance.hostname=:${spring.cloud.client.ipAddress}
eureka.instance.status-page-url:http://${spring.cloud.client.ipAddress}:${server.port}/swagger-ui.html
####################################################################################################################
#eureka注册中心路径
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
#表示本服务发送给eureka服务端的心跳时间
eureka.instance.leaseRenewalIntervalInSeconds: 10
#当本服务掉线后,eureka服务端取掉本服务的缓存的时间
eureka.instance.leaseExpirationDurationInSeconds: 2
#注册到eureka上的服务的名字
eureka.instance.instance-id=http://${spring.cloud.client.ipAddress}:${server.port}/${spring.application.name}
#######################################################################################################################
#逻辑删除配置(下面3个配置),不是真实删除数据,只是逻辑删除数据
mybatis-plus.global-config.logic-delete-value=1
mybatis-plus.global-config.logic-not-delete-value=0
mybatis-plus.global-config.sql-injector=com.baomidou.mybatisplus.mapper.LogicSqlInjector
##############################################################################################################
mybatis-plus.global-config.meta-object-handler=com.blog.permission.mabatisPlus.MyMetaObjectHandler
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.cache-enabled=false
mybatis-plus.configuration.jdbc-type-for-null=null
mybatis-plus.typeAliasesPackage=com.blog.permission.entity
mybatis-plus.global-config.id-type=3
mybatis-plus.global-config.field-strategy=2
mybatis-plus.global-config.key-generator=com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
复制代码

启动类 PermissionApplication.java 文件

图片:

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

代码:

@EnableWebSecurity
@SpringCloudApplication
@EnableTransactionManagement
@EnableFeignClients
@ComponentScan(basePackages = "com.blog.permission")
@EnableAsync
@EnableScheduling
@EnableSwagger2
@EnableWebMvc
public class PermissionApplication {

	public static void main(String[] args) {
		SpringApplication.run(PermissionApplication.class, args);;
	}

}
复制代码

接下来,要开始新增配置文件了。

swagger的配置文件。

新增配置文件:Swagger2.java

@Configuration
@EnableSwagger2
public class Swagger2 {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.blog.permission.controller"))
                .paths(Predicates.not(PathSelectors.regex("/error.*")))//错误路径不监控
                .paths(PathSelectors.regex("/.*"))// 对根下所有路径进行监控
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                //页面标题
                .title("登录以及权限管理20190926")
                //描述
                .description("项目API文档")
                //创建人
                .contact("就是作者我")
                //版本号
                .version("1.0")
                .build();
    }

}
复制代码

新增配置文件:WebMvcConfig.java

@Configuration
@EnableWebMvc
class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    //设置swagger里面返回的responsebody的值为json字符串
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        List<MediaType> list=new ArrayList<MediaType>();
        list.add(MediaType.APPLICATION_JSON_UTF8);
        list.add(new MediaType("text","html", Charset.forName("UTF-8")));
        list.add(new MediaType("application","*+json",Charset.forName("UTF-8")));
        converter.setSupportedMediaTypes(list);
        converters.add(converter);
    }


}
复制代码

mybatisPlus的配置文件

新增配置文件:MybatisPlusConfig,java

@EnableTransactionManagement
@Configuration
@MapperScan("com.blog.*.mapper")
public class MybatisPlusConfig {
    /**
     * mybatis-plus SQL执行效率插件【生产环境可以关闭】
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        return new PerformanceInterceptor();
    }

    /*
     * 分页插件,自动识别数据库类型 多租户,请参考官网【插件扩展】
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    @Bean
    public MetaObjectHandler metaObjectHandler() {
        return new MyMetaObjectHandler();
    }

    /**
     * 注入主键生成器
     */
    @Bean
    public IKeyGenerator keyGenerator() {
        return new H2KeyGenerator();
    }

    /**
     * 注入sql注入器
     */
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }

}
复制代码

新增配置文件:MybatisPlusSql.java

public class MybatisPlusSql implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {
    private static final Log LOGGER = LogFactory.getLog(SqlSessionFactoryBean.class);
    private Resource configLocation;
    private Configuration configuration;
    private Resource[] mapperLocations;
    private DataSource dataSource;
    private TransactionFactory transactionFactory;
    private Properties configurationProperties;
    private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    private SqlSessionFactory sqlSessionFactory;
    private String environment = SqlSessionFactoryBean.class.getSimpleName();
    private boolean failFast;
    private Interceptor[] plugins;
    private TypeHandler<?>[] typeHandlers;
    private String typeHandlersPackage;
    private Class<?>[] typeAliases;
    private String typeAliasesPackage;
    private Class<?> typeAliasesSuperType;
    private DatabaseIdProvider databaseIdProvider;
    private Class<? extends VFS> vfs;
    private Cache cache;
    private ObjectFactory objectFactory;
    private ObjectWrapperFactory objectWrapperFactory;




    @Override
    public SqlSessionFactory getObject() throws Exception {
        return null;
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }

    @Override
    public void afterPropertiesSet() throws Exception {

    }

    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {

    }
}
复制代码

新增配置文件:MyMetaObjectHandler.java

@Component
public class MyMetaObjectHandler extends MetaObjectHandler {

    protected final static Logger logger = LoggerFactory.getLogger(Application.class);

    @Override
    public void insertFill(MetaObject metaObject) {
        logger.info("新增数据库:");
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        logger.info("修改数据库:");
    }
}

复制代码

因为要避免一些启动的时候爆出的一些错误,我还新建了一个空白的config.properties文件,里面什么都没有。

好的,配置文件基本上已经妥了,但是如果这个时候启动服务,依然会报错,因为你没有配套的controller,serivice,mapper等等文件。

因此,我创建了一个实体类,用来专门生成代码。

代码生成器:CreateCodeMethod.java

@Component public class CreateCodeMethod {

/**
     *
     * @Title: main
     * @Description: 生成
     * @param args
     */
    public static void main(String[] args) {
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir("D://"); //输出文件路径
        gc.setFileOverride(true);
        gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false
        gc.setEnableCache(false);// XML 二级缓存
        gc.setBaseResultMap(true);// XML ResultMap
        gc.setBaseColumnList(false);// XML columList
        gc.setAuthor("wuchong");// 作者

        // 自定义文件命名,注意 %s 会自动填充表实体属性!
        gc.setControllerName("%sController");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setUrl("jdbc:mysql://localhost:3306/myblog");
        mpg.setDataSource(dsc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // strategy.setTablePrefix(new String[] { "sys_" });// 此处可以修改为您的表前缀
        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
        strategy.setInclude(new String[] { "permission","permission_manage","user"}); // 需要生成的表
        strategy.setLogicDeleteFieldName("record_status");//设置逻辑删除的字段
        strategy.setSuperServiceClass(null);
        strategy.setEntityLombokModel(true);
        strategy.setSuperServiceImplClass(null);
        strategy.setSuperMapperClass(null);

        mpg.setStrategy(strategy);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("blog");
        pc.setController("controller");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        pc.setMapper("mapper");
        pc.setEntity("entity");
        pc.setXml("xml");
        mpg.setPackageInfo(pc);

        // 执行生成
        mpg.execute();

    }

}
复制代码

这里必须要讲一下我的表结构了,以我mysql的表结构为例子:

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

可以看到,我的数据库的表user中有一个字段record_status,这个字段是我机会用来做逻辑删除的,相信经常开发业务的小伙伴知道,一般的表数据不会真的物理删除,只会进行逻辑删除,而mybatisPlus的可以简单的封装这个逻辑删除,当你在使用代码生成器的时候,请注意我在下面的截图:

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus
我框起来的一段代码,是为了保证你在生成实体类的时候,这个record_status字段有着特定的一个注解: @TableLogic
手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

有了这个注解,你在调用mybatisPlus的删除方法的时候,它就会逻辑删除你的数据了。

好的,生成的各个java文件,我是配置到了D盘的blog文件夹中,取出来,放到项目中。

如图所示:

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

controller文件:

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

service文件:

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

ServiceImpl文件:

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

mapper文件:

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

mapper.xml文件:

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

这个时候,可以开始启动服务了。

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

打开网页,输入网址:localhost:1111( ps:这个eureka服务端是上一篇文章建立的,先讲eureka服务端启动,再来启动我们刚刚创建的eureka客户端

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

可以看到,我们的服务已经注册到eureka上去了。

点击: http://192.168.1.5:2222/permission,可以进入到swagger页面,如下图所示

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

可以测试一下了我们配置的东西是否完善可行了。

总结

我搭建的这个eureka客户端,实际上是可以满足单纯只是自己玩一玩的开发需求了。

需要注意的地方是,你可以按照你自己的爱好来创建文件,但是一定要注意配置文件,你比如说,在application.properties文件中有这么一个配置:

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

这个配置对应的文件,是我创建的一个配置文件 MyMetaObjectHandler.java 所在的地方.

手把手搭建springCloud框架(二)——eureka客户端+swagger+mybatisPlus

因此,当你准备开始搭建自己的springCloud的时候,一定要注意所有的配置文件,你理所应当的把所有的配置文件看一遍,最好是按照我的文章完全一样的搭建一次,然后再按照你的思路来玩才能没问题。

原文  https://juejin.im/post/5d8e07615188252cdb5e302c
正文到此结束
Loading...