Giter Site home page Giter Site logo

xkcoding / spring-boot-demo Goto Github PK

View Code? Open in Web Editor NEW
32.0K 32.0K 10.7K 13.86 MB

🚀一个用来深入学习并实战 Spring Boot 的项目。

Home Page: https://parg.co/UZM

License: MIT License

Java 86.76% HTML 8.88% FreeMarker 0.11% Dockerfile 0.07% PLpgSQL 1.27% TSQL 2.79% Lua 0.12%
demo in-action java spring spring-boot spring-boot-2 spring-boot-demo web xkcoding

spring-boot-demo's Introduction

Travis-CI Codacy author JDK Spring Boot LICENSE

star star star

中文 | English

项目简介

spring boot demo 是一个用来深度学习并实战 spring boot 的项目,目前总共包含 66 个集成demo,已经完成 55 个。

该项目已成功集成 actuator(监控)、admin(可视化监控)、logback(日志)、aopLog(通过AOP记录web请求日志)、统一异常处理(json级别和页面级别)、freemarker(模板引擎)、thymeleaf(模板引擎)、Beetl(模板引擎)、Enjoy(模板引擎)、JdbcTemplate(通用JDBC操作数据库)、JPA(强大的ORM框架)、mybatis(强大的ORM框架)、通用Mapper(快速操作Mybatis)、PageHelper(通用的Mybatis分页插件)、mybatis-plus(快速操作Mybatis)、BeetlSQL(强大的ORM框架)、upload(本地文件上传和七牛云文件上传)、redis(缓存)、ehcache(缓存)、email(发送各种类型邮件)、task(基础定时任务)、quartz(动态管理定时任务)、xxl-job(分布式定时任务)、swagger(API接口管理测试)、security(基于RBAC的动态权限认证)、SpringSession(Session共享)、Zookeeper(结合AOP实现分布式锁)、RabbitMQ(消息队列)、Kafka(消息队列)、websocket(服务端推送监控服务器运行信息)、socket.io(聊天室)、ureport2(**式报表)、打包成war文件、集成 ElasticSearch(基本操作和高级查询)、Async(异步任务)、集成Dubbo(采用官方的starter)、MongoDB(文档数据库)、neo4j(图数据库)、docker(容器化)、JPA多数据源Mybatis多数据源代码生成器、GrayLog(日志收集)、JustAuth(第三方登录)、LDAP(增删改查)、动态添加/切换数据源、单机限流(AOP + Guava RateLimiter)、分布式限流(AOP + Redis + Lua)、ElasticSearch 7.x(使用官方 Rest High Level Client)、HTTPS、Flyway(数据库初始化)、UReport2(**式复杂报表)。

如果大家还有想要集成的demo,也可在 issue 里提需求。我会额外添加在 TODO 列表里。✊

分支介绍

  • master 分支:基于 Spring Boot 版本 2.1.0.RELEASE,每个 Module 的 parent 依赖根目录下的 pom.xml,主要用于管理每个 Module 的通用依赖版本,方便大家学习。
  • v-1.5.x 分支:基于 Spring Boot 版本 1.5.8.RELEASE,每个 Module 均依赖 spring-boot-demo-parent,有挺多同学们反映这种方式对新手不是很友好,运行起来有些难度,因此 此分支(v-1.5.x)会停止开发维护 ,所有内容会慢慢以 master 分支的形式同步过去,此分支暂未完成的,也会直接在 master 分支上加,在此分支学习的同学们,仍然可以在此分支学习,但是建议后期切换到master分支,会更加容易,毕竟官方已经将 Spring Boot 升级到 2.x 版本。🙂

开发环境

  • JDK 1.8 +
  • Maven 3.5 +
  • IntelliJ IDEA ULTIMATE 2018.2 + (注意:务必使用 IDEA 开发,同时保证安装 lombok 插件)
  • Mysql 5.7 + (尽量保证使用 5.7 版本以上,因为 5.7 版本加了一些新特性,同时不向下兼容。本 demo 里会尽量避免这种不兼容的地方,但还是建议尽量保证 5.7 版本以上)

运行方式

提示:如果是 fork 的朋友,同步代码的请参考:https://xkcoding.com/2018/09/18/how-to-update-the-fork-project.html

  1. git clone https://github.com/xkcoding/spring-boot-demo.git
  2. 使用 IDEA 打开 clone 下来的项目
  3. 在 IDEA 中 Maven Projects 的面板导入项目根目录下 的 pom.xml 文件
  4. Maven Projects 找不到的童鞋,可以勾上 IDEA 顶部工具栏的 View -> Tool Buttons ,然后 Maven Projects 的面板就会出现在 IDEA 的右侧
  5. 找到各个 Module 的 Application 类就可以运行各个 demo 了
  6. 注意:每个 demo 均有详细的 README 配套,食用 demo 前记得先看看哦~
  7. 注意:运行各个 demo 之前,有些是需要事先初始化数据库数据的,亲们别忘记了哦~

项目趋势

Stargazers over time

其他

团队纳新

组内招人啦,HC 巨多,Base 杭州,感兴趣的小伙伴,查看 岗位详情

开源推荐

11628591293_.pic_hd

开发计划

查看 TODO 文件

各 Module 介绍

Module 名称 Module 介绍
demo-helloworld spring-boot 的一个 helloworld
demo-properties spring-boot 读取配置文件中的内容
demo-actuator spring-boot 集成 spring-boot-starter-actuator 用于监控 spring-boot 的启动和运行状态
demo-admin-client spring-boot 集成 spring-boot-admin 来可视化的监控 spring-boot 程序的运行状态,可以与 actuator 互相搭配使用,客户端示例
demo-admin-server spring-boot 集成 spring-boot-admin 来可视化的监控 spring-boot 程序的运行状态,可以与 actuator 互相搭配使用,服务端示例
demo-logback spring-boot 集成 logback 日志
demo-log-aop spring-boot 使用 AOP 切面的方式记录 web 请求日志
demo-exception-handler spring-boot 统一异常处理,包括2种,第一种返回统一的 json 格式,第二种统一跳转到异常页面
demo-template-freemarker spring-boot 集成 Freemarker 模板引擎
demo-template-thymeleaf spring-boot 集成 Thymeleaf 模板引擎
demo-template-beetl spring-boot 集成 Beetl 模板引擎
demo-template-enjoy spring-boot 集成 Enjoy 模板引擎
demo-orm-jdbctemplate spring-boot 集成 Jdbc Template 操作数据库,并简易封装通用 Dao 层
demo-orm-jpa spring-boot 集成 spring-boot-starter-data-jpa 操作数据库
demo-orm-mybatis spring-boot 集成原生mybatis,使用 mybatis-spring-boot-starter 集成
demo-orm-mybatis-mapper-page spring-boot 集成通用MapperPageHelper,使用 mapper-spring-boot-starterpagehelper-spring-boot-starter 集成
demo-orm-mybatis-plus spring-boot 集成 mybatis-plus,使用 mybatis-plus-boot-starter 集成,集成 BaseMapper、BaseService、ActiveRecord 操作数据库
demo-orm-beetlsql spring-boot 集成 beetl-sql,使用 beetl-framework-starter 集成
demo-upload spring-boot 文件上传示例,包含本地文件上传以及七牛云文件上传
demo-cache-redis spring-boot 整合 redis,操作redis中的数据,并使用redis缓存数据
demo-cache-ehcache spring-boot 整合 ehcache,使用 ehcache 缓存数据
demo-email spring-boot 整合 email,包括发送简单文本邮件、HTML邮件(包括模板HTML邮件)、附件邮件、静态资源邮件
demo-task spring-boot 快速实现定时任务
demo-task-quartz spring-boot 整合 quartz,并实现对定时任务的管理,包括新增定时任务,删除定时任务,暂停定时任务,恢复定时任务,修改定时任务启动时间,以及定时任务列表查询,提供前端页面
demo-task-xxl-job spring-boot 整合xxl-job,并提供绕过 xxl-job-admin 对定时任务的管理的方法,包括定时任务列表,触发器列表,新增定时任务,删除定时任务,停止定时任务,启动定时任务,修改定时任务,手动触发定时任务
demo-swagger spring-boot 集成原生的 swagger 用于统一管理、测试 API 接口
demo-swagger-beauty spring-boot 集成第三方 swagger swagger-bootstrap-ui 美化API文档样式,用于统一管理、测试 API 接口
demo-rbac-security spring-boot 集成 spring security 完成基于RBAC权限模型的权限管理,支持自定义过滤请求,动态权限认证,使用 JWT 安全认证,支持在线人数统计,手动踢出用户等操作
demo-rbac-shiro spring-boot 集成 shiro 实现权限管理
待完成
demo-session spring-boot 集成 Spring Session 实现Session共享、重启程序Session不失效
demo-oauth spring-boot 实现 oauth 服务器功能,实现授权码机制
待完成
demo-social spring-boot 集成第三方登录,集成 justauth-spring-boot-starter 实现QQ登录、GitHub登录、微信登录、谷歌登录、微软登录、小米登录、企业微信登录。
demo-zookeeper spring-boot 集成 Zookeeper 结合AOP实现分布式锁
demo-mq-rabbitmq spring-boot 集成 RabbitMQ 实现基于直接队列模式、分列模式、主题模式、延迟队列的消息发送和接收
demo-mq-rocketmq spring-boot 集成 RocketMQ,实现消息的发送和接收
待完成
demo-mq-kafka spring-boot 集成 kafka,实现消息的发送和接收
demo-websocket spring-boot 集成 websocket,后端主动推送前端服务器运行信息
demo-websocket-socketio spring-boot 使用 netty-socketio 集成 websocket,实现一个简单的聊天室
demo-ureport2 spring-boot 集成 ureport2 实现复杂的自定义的**式报表
待完成
demo-uflo spring-boot 集成 uflo 快速实现轻量级流程引擎
待完成
demo-urule spring-boot 集成 urule 快速实现规则引擎
待完成
demo-activiti spring-boot 集成 activiti 7 流程引擎
待完成
demo-async spring-boot 使用原生提供的异步任务支持,实现异步执行任务
demo-war spring-boot 打成 war 包的配置
demo-elasticsearch spring-boot 集成 ElasticSearch,集成 spring-boot-starter-data-elasticsearch 完成对 ElasticSearch 的高级使用技巧,包括创建索引、配置映射、删除索引、增删改查基本操作、复杂查询、高级查询、聚合查询等
demo-dubbo spring-boot 集成 Dubbo,分别为公共模块 spring-boot-demo-dubbo-common、服务提供方spring-boot-demo-dubbo-provider、服务调用方spring-boot-demo-dubbo-consumer
demo-mongodb spring-boot 集成 MongoDB,使用官方的 starter 实现增删改查
demo-neo4j spring-boot 集成 Neo4j 图数据库,实现一个校园人物关系网的demo
demo-docker spring-boot 容器化
demo-multi-datasource-jpa spring-boot 使用JPA集成多数据源
demo-multi-datasource-mybatis spring-boot 使用Mybatis集成多数据源,使用 Mybatis-Plus 提供的开源解决方案实现
demo-sharding-jdbc spring-boot 使用 sharding-jdbc 实现分库分表,同时ORM采用 Mybatis-Plus
demo-tio spring-boot 集成 tio 网络编程框架
待完成
demo-grpc spring-boot 集成grpc,配置tls/ssl,参见ISSUE#5
待完成
demo-codegen spring-boot 集成 velocity 模板技术实现的代码生成器,简化开发
demo-graylog spring-boot 集成 graylog 实现日志统一收集
demo-sso spring-boot 集成 SSO 单点登录,参见 ISSUE#12
待完成
demo-ldap spring-boot 集成 LDAP,集成 spring-boot-starter-data-ldap 完成对 Ldap 的基本 CURD操作, 并给出以登录为实战的 API 示例,参见 ISSUE#23,感谢 @fxbin
demo-dynamic-datasource spring-boot 动态添加数据源、动态切换数据源
demo-ratelimit-guava spring-boot 使用 Guava RateLimiter 实现单机版限流,保护 API
demo-ratelimit-redis spring-boot 使用 Redis + Lua 脚本实现分布式限流,保护 API
demo-https spring-boot 集成 HTTPS
demo-elasticsearch-rest-high-level-client spring boot 集成 ElasticSearch 7.x 版本,使用官方 Rest High Level Client 操作 ES 数据
demo-flyway spring boot 集成 Flyway,项目启动时初始化数据库表结构,同时支持数据库脚本版本控制
demo-ureport2 spring boot 集成 Ureport2,实现**式复杂报表设计

特别感谢

License

MIT

Copyright (c) 2018 Yangkai.Shen

spring-boot-demo's People

Contributors

76peter avatar chenqi146 avatar freshgeek avatar fxbin avatar lilaccoral avatar lizhongyue248 avatar taffier avatar xkcoding avatar yanshaoshuai avatar yaodehaung avatar yidasanqian avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

spring-boot-demo's Issues

关于spring-boot-demo-properties项目获取不到pom的值

需要在pom文件下加入以下代码

	<build>
		<finalName>spring-boot-demo-properties</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
	</build>

另外,获取pom的值也可以使用${}方式

application:
  name: prod环境 @artifactId@
  version: prod环境 ${project.version}
developer:
  name: prod环境 xkcoding
  website: prod环境 http://xkcoding.com
  qq: prod环境 237497819
  phone-number: prod环境 17326075631

邮件发送demo

我将邮箱配置换成自己的163邮箱之后为什么发送出去之后会变成垃圾邮件发送给对方?
前两天测试demo上的邮箱可以正常发送,现在demo上的邮箱不能使用了。
多谢!

actuator不能加入其它Controller

我在启动类加入hello world,

@SpringBootApplication
public class SpringBootDemoActuatorApplication {

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

	@RequestMapping("/hello")
	public String sayHello(){
	    return "Hello";
    }

}

浏览器打开相关链接会强制跳转到登录界面(Bug?),登录后也报错
在actuator的mappings里面也找不到相关API

[FEATURE]利用Spring缓存注解如@Cacheable操作redis,后台查看redis中的数据,value是乱码,建议序列化为 json

描述问题

xk,你好;
spring-boot-demo-cache-redis 项目中,利用Spring缓存注解如 @Cacheable 操作redis,后台查看redis中的数据,key没有乱码,但是value是乱码;
利用 RedisTemplate 操作value没有乱码。

期待的结果

期望利用Spring缓存注解如@Cacheable操作redis,查看redis中的数据,value不是乱码。

截屏或录像

image

[FEATURE]可否考虑集成SpringBatch

你在什么场景下需要该功能?

进行数据迁移,例如,mysqlA->mysqlB中。或者从文本类文件写入数据到mysql中

描述可能的解决方案

SpringBatch进行处理

请问完全按照你的demo写,发现报这个错误,请问是什么原因造成的?

描述问题

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'propertyController' defined in file [/Users/zhangliang/Desktop/**/spring2019.9/springbootdemoproperties/target/classes/com/example/springbootdemoproperties/controller/PropertyController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'applicationProperty': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'application.name' in value "${application.name}"
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1341) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1187) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744) [spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]

期待的结果

请尽量清晰精准地描述你所期待的结果。

截屏或录像

如果可能,请尽量附加截图或录像来描述你遇到的问题。

其他信息

请提供其他附加信息帮助我们诊断问题。

Add examples.

Should we consider add example to each topics?
How to use it and best practice to use it!

I.e: for helloworld demo the example would be http://localhost:8080/demo/hello?who=ibrahim

AppLog 记录http请求日志的方式,可以考虑用这种方式

@Component
@Slf4j
@Data
public class HttpTraceLogFilter extends OncePerRequestFilter implements Ordered {

    private boolean logSwitch = false;  // 这里是开关,自行控制改成true;显示打印日志

    private String checkPath = "/check_is_online";  // 监控接口,不加日志

    private static final String IGNORE_CONTENT_TYPE = "multipart/form-data";

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE - 10;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        /**
        if (!isRequestValid(request)) {
            filterChain.doFilter(request, response);
            return;
        }
         **/

        if (!(request instanceof ContentCachingRequestWrapper)) {
            request = new ContentCachingRequestWrapper(request);
        }

        if (!(response instanceof ContentCachingResponseWrapper)) {
            response = new ContentCachingResponseWrapper(response);
        }
        int status = HttpStatus.INTERNAL_SERVER_ERROR.value();
        long startTime = System.currentTimeMillis();
        try {
            filterChain.doFilter(request, response);
            status = response.getStatus();
        } finally {
            String path = request.getRequestURI();
            if (logSwitch && !Objects.equals(path, checkPath)
                    && !Objects.equals(IGNORE_CONTENT_TYPE, request.getContentType())) {

                String requestBody = IOUtils.toString(request.getInputStream(), "UTF-8");
                log.info(requestBody);
                //1. 记录日志
                HttpTraceLog traceLog = new HttpTraceLog();
                traceLog.setPath(path);
                traceLog.setMethod(request.getMethod());
                long latency = System.currentTimeMillis() - startTime;
                traceLog.setTimeTaken(latency);
                traceLog.setTime(LocalDateTime.now().toString());
                traceLog.setParameterMap(request.getParameterMap());
                traceLog.setHeaderMap(getHeaders(request));
                traceLog.setStatus(status);
                traceLog.setRequestBody(getRequestBody(request));
                traceLog.setResponseBody(getResponseBody(response));
                log.info("http trace log: {}", JSON.toJSONString(traceLog));
            }
            updateResponse(response);
        }
    }

    private boolean isRequestValid(HttpServletRequest request) {
        try {
            new URI(request.getRequestURL().toString());
            return true;
        } catch (URISyntaxException ex) {
            return false;
        }
    }

    private String getRequestBody(HttpServletRequest request) {
        String requestBody = "";
        ContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, ContentCachingRequestWrapper.class);
        if (wrapper != null) {
            try {
                requestBody = IOUtils.toString(wrapper.getContentAsByteArray(), wrapper.getCharacterEncoding());
            } catch (IOException e) {
                // NOOP
            }
        }
        return requestBody;
    }

    private String getResponseBody(HttpServletResponse response) {
        String responseBody = "";
        ContentCachingResponseWrapper wrapper = WebUtils.getNativeResponse(response, ContentCachingResponseWrapper.class);
        if (wrapper != null) {
            try {
                responseBody = IOUtils.toString(wrapper.getContentAsByteArray(), wrapper.getCharacterEncoding());
            } catch (IOException e) {
                // NOOP
            }
        }
        return responseBody;
    }


    private Map<String,String> getHeaders(HttpServletRequest request) {
        Map<String,String> headers = Maps.newHashMap();
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String key = headerNames.nextElement();
            headers.put(key, request.getHeader(key));
        }
        return headers;
    }

    private void updateResponse(HttpServletResponse response) throws IOException {
        ContentCachingResponseWrapper responseWrapper = WebUtils.getNativeResponse(response, ContentCachingResponseWrapper.class);
        Objects.requireNonNull(responseWrapper).copyBodyToResponse();
    }


    @Data
    private static class HttpTraceLog {

        private String path;
        private Map<String, String[]> parameterMap;
        private Map<String, String> headerMap;
        private String method;
        private Long timeTaken;
        private String time;
        private Integer status;
        private String requestBody;
        private String responseBody;
    }

}

zookeeper 分布式锁报错

`2019-05-31 17:27:41.247 ERROR 10732 --- [ain-EventThread] org.apache.zookeeper.ClientCnxn : Error while calling watcher

java.lang.IncompatibleClassChangeError: Inconsistent constant pool data in classfile for class org/apache/curator/framework/CuratorFramework. Method lambda$postSafeNotify$0(Ljava/lang/Object;)V at index 99 is CONSTANT_MethodRef and should be CONSTANT_InterfaceMethodRef
at org.apache.curator.framework.CuratorFramework.postSafeNotify(CuratorFramework.java:344) ~[curator-framework-4.1.0.jar:4.1.0]
at org.apache.curator.framework.recipes.locks.LockInternals$2.process(LockInternals.java:69) ~[curator-recipes-4.1.0.jar:4.1.0]
at org.apache.curator.framework.imps.NamespaceWatcher.process(NamespaceWatcher.java:77) ~[curator-framework-4.1.0.jar:4.1.0]
at org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:525) ~[zookeeper-3.5.4-beta.jar:3.5.4-beta-7f51e5b68cf2f80176ff944a9ebd2abbc65e7327]
at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:500) ~[zookeeper-3.5.4-beta.jar:3.5.4-beta-7f51e5b68cf2f80176ff944a9ebd2abbc65e7327]
`

[FEATURE] 作者能否在demo里尽量加一些controller展示用法

首先感谢作者的辛勤付出,写出这么多的demo。我的意见是:对于新手来说,有的demo里面只是集成了个功能模块,但是似乎并没有展示怎么简单的使用,比如mybatis,我觉得如果demo里加一个controller 来展示一下如何使用会更好。

[BUG]spring-boot 使用 2.1.8.RELEASE 启动 spring-boot-demo-task-quartz 项目,项目报错,无法启动。

描述问题

我在使用 spring-boot 的 2.1.8.RELEASE 开发定时任务功能时,使用数据库保存定时任务配置,启动项目过程中会报错,无法启动项目(错误日志在下面)。从网上没有查到类似的错误,然后将 spring-boot 的版本切换到 2.1.7.RELEASE 可以正常启动项目。怀疑是不是我项目配置有问题,我就下载了 spring-boot-demo-task-quartz 项目,将 spring-boot 版本修改为2.1.8.RELEASE 项目无法启动,报错内容相同,修改版本为 2.1.7.RELEASE 项目可以正常启动。

错误日志

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration$JdbcStoreTypeConfiguration$QuartzSchedulerDependencyConfiguration': Unexpected exception during bean creation; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:528) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744) [spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391) [spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) [spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204) [spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at com.xkcoding.task.quartz.SpringBootDemoTaskQuartzApplication.main(SpringBootDemoTaskQuartzApplication.java:25) [classes/:na]
Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
	at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724) ~[na:1.8.0_171]
	at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531) ~[na:1.8.0_171]
	at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355) ~[na:1.8.0_171]
	at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286) ~[na:1.8.0_171]
	at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120) ~[na:1.8.0_171]
	at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72) ~[na:1.8.0_171]
	at java.lang.reflect.Executable.declaredAnnotations(Executable.java:599) ~[na:1.8.0_171]
	at java.lang.reflect.Executable.declaredAnnotations(Executable.java:597) ~[na:1.8.0_171]
	at java.lang.reflect.Executable.getAnnotation(Executable.java:570) ~[na:1.8.0_171]
	at java.lang.reflect.Method.getAnnotation(Method.java:622) ~[na:1.8.0_171]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.lambda$determineCandidateConstructors$0(AutowiredAnnotationBeanPostProcessor.java:249) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:410) ~[spring-core-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:417) ~[spring-core-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:389) ~[spring-core-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:248) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1269) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1184) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	... 14 common frames omitted

期待的结果

在 spring-boot 的 2.1.8.RELEASE 版本下需要如何配置 quartz 才可以正常使用 quartz。

多模块问题

请问一下在spring-boot-dubbo中是如何创建子模块下的子模块,我本地一创建,就会报错。只能穿件一层子模块

Spring-boot-demo中的基于Guava实现的限流,多方法注解不能限流

描述问题

Spring-boot-demo中的spring-boot-demo-ratelimit-guava项目,我如果把注解RateLimiter注解到不同的方法上面,就不能对不同的方法实现不同令牌的限流。

期待的结果

在不使用Redis的情况下,能不能就通过Guava的RateLimiter方法实现单服务不同方法的不同令牌的限流。

多项目 日志动态精确 控制

目标:
1、项目提供restful接口,动态 修改 线上项目的日志级别,动态 生成添加 新的包路径logger 记录包日志 (支持log4j2,logback).
2、可以动态指定 某个用户的 userId ,让该用户所有操作行为日志全为debug(可指定)级别,且把该日志全单独写入一个独立文件,可以根据userId 查询某用户所有操作日志(有页面可以操作)
3、一个请求中,异步任务也需能支持日志动态改变,需设置线程池支持。
4、多个项目,使用共享redis 支持。一处操作,所有关联项目都同时同步 更改日志的操作

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.