Spring Boot

Spring Boot2从入门到实战:统一异常处理

白昼怎懂夜的黑 提交于 2021-02-14 18:54:38
都说管理的精髓就是“制度管人,流程管事”。而所谓流程,就是对一些日常工作环节、方式方法、次序等进行标准化、规范化。且不论精不精髓,在技术团队中,对一些通用场景,统一规范是必要的,只有步调一致,才能高效向前。如前后端交互协议,如本文探讨的异常处理。 1. Spring Mvc中的异常处理 在spring mvc中,跟异常处理的相关类大致如下 上图中,spring mvc中处理异常的类(包括在请求映射时与请求处理过程中抛出的异常),都是 HandlerExceptionResolver 接口的实现,并且都实现了 Ordered 接口。与拦截器链类似,如果容器中存在多个实现了 HandlerExceptionResolver 接口的异常处理类,则它们的 resolveException 方法会被依次调用,顺序由order决定,值越小的先执行,只要其中一个调用返回不是null,则后续的异常处理将不再执行。 各实现类简单介绍如下: DefaultHandlerExceptionResolver : 这个是默认实现,处理Spring定义的各种标准异常,将其转换为对应的Http Status Code,具体处理的异常参考 doResolveException 方法 ResponseStatusExceptionResolver :用来支持@ResponseStatus注解使用的实现

ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component...

|▌冷眼眸甩不掉的悲伤 提交于 2021-02-14 14:14:17
今天第一次遇到Failed to start component [StandardEngine[Catalina].StandardHost[localhost].错误,并且在错误提示的后半段出现了刚刚删除的工程 因此出现这种错误的原因可能有: 1.tomcat存在缓存   右键点击tomcat-->Clean Tomcat Work Directory.. --> Clean..   对tomcat进行清理 2.tomcat自己出现了问题   将tomcat删除,重新添加并配置一下tomcat 3.其他情况... Caused by: java.lang.NoClassDefFoundError: org/apache/tomcat/util/descriptor/tld/TldParser 原因还是依赖了spring boot 内部提供的tomcat的问题,将上面pom的配置改成下面这样即可(作用域设置成依赖外部tomcat容器提供的jsp): <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency>    Springboot tomcat-embed

Dockerfile 之最小化 Java 镜像的常用技巧

折月煮酒 提交于 2021-02-14 14:07:32
背景 随着容器技术的普及,越来越多的应用被容器化。人们使用容器的频率越来越高,但常常忽略一个基本但又非常重要的问题 - 容器镜像的体积。本文将介绍精简容器镜像的必要性并以基于 spring boot 的 java 应用为例描述最小化容器镜像的常用技巧。 精简容器镜像的必要性 精简容器镜像是非常必要的,下面分别从安全性和敏捷性两个角度进行阐释。 安全性 基于安全方面的考虑,将不必要的组件从镜像中移除可以减少攻击面、降低安全风险。虽然 docker 支持用户通过 Seccomp 限制容器内可以执行操作或者使用 AppArmor 为容器配置安全策略,但它们的使用门槛较高,要求用户具备安全领域的专业素养。 敏捷性 精简的容器镜像能提高容器的部署速度。假设某一时刻访问流量激增,您需要通过增加容器副本数以应对突发压力。如果某些宿主机不包含目标镜像,需要先拉取镜像,然后启动容器,这时使用体积较小的镜像能加速这一过程、缩短扩容时间。另外,镜像体积越小,其构建速度也越快,同时还能减少存储和传输的成本。 常用技巧 将一个 java 应用容器化所需的步骤可归纳如下: 编译 java 源码并生成 jar 包。 将应用 jar 包和依赖的第三方 jar 包移动到合适的位置。 本章所用的样例是一个基于 spring boot 的 java 应用 spring-boot-docker,所用的未经优化的

SpringCloud----熔断机制 -- 断路器hystrix

浪子不回头ぞ 提交于 2021-02-14 13:58:17
参考借鉴:http://www.cnblogs.com/chry/p/7279856.html SpringCloud Netflix实现了断路器库的名字叫Hystrix. 在微服务架构下,通常会有多个层次的服务调用. 下面是微服架构下, 浏览器端通过API访问后台微服务的一个示意图: 一个微服务的超时失败可能导致瀑布式连锁反映,下图中,Hystrix通过自主反馈实现的断路器, 防止了这种情况发生。 图中的服务B因为某些原因失败,变得不可用,所有对服务B的调用都会超时。当对B的调用失败达到一个特定的阀值(5秒之内发生20次失败是Hystrix定义的缺省值), 链路就会被处于open状态, 之后所有所有对服务B的调用都不会被执行, 取而代之的是由断路器提供的一个表示链路open的Fallback消息. Hystrix提供了相应机制,可以让开发者定义这个Fallbak消息. open的链路阻断了瀑布式错误, 可以让被淹没或者错误的服务有时间进行修复。这个fallback可以是另外一个Hystrix保护的调用, 静态数据,或者合法的空值. Fallbacks可以组成链式结构,所以,最底层调用其它业务服务的第一个Fallback返回静态数据. 下面,进入正题,在之前的两HELLO WORLD服务集群中加入断路器, 防止其中一个Hello world挂掉后, 导致系统发生连锁超时失败。 1.

第19章—后端分页(PageHelper)

旧巷老猫 提交于 2021-02-14 12:04:24
spring boot 系列学习记录: http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址: https://gitee.com/jinxiaohang/springboot   PageHelper开源分页工具:      https://gitee.com/free/Mybatis_PageHelper         https://github.com/pagehelper/Mybatis-PageHelper   本次练习在之前 第04章—整合Mybatis 基础上进行,这里只进行简单使用,详细请参考官方文档 一、添加依赖 专门为了集成springboot设计的,使用起来很方便,建议使用。 < dependency > < groupId > com.github.pagehelper </ groupId > < artifactId > pagehelper-spring-boot-starter </ artifactId > < version > 1.2.3 </ version > </ dependency > 如果使用以下集成springboot比较麻烦,本次不使用,所以采用上面的依赖进行实现。 < dependency > < groupId > com.github.pagehelper <

Springboot 整合RabbitMQ

 ̄綄美尐妖づ 提交于 2021-02-14 09:30:32
消息队列 何谓消息队列,我们都知道,队列 queue 我们在学习线程知识的时候碰到过,多线程 生产者消费者模型 生产者生产产品到队列当中。消费者从队列当中拿取产品进行消费。这就是一个队列,当生产者消费的速度大于消费者消费的速度,所堆积起来的东西就需要一个东西来进行缓存它,然后让消费者慢慢消费。就好比一个冰箱,一次性买的太多吃不完,那就先放到冰箱里面,慢慢吃完。 RabbitMQ 作为一款优秀的消息队列,生产者和消费者通过中间件队列进行解耦。无需关心是谁生产的,达到解耦的目的。 相关概念 我们通过这样一张图,就会有这样几个概念需要理解 生产者 消费者 RabbitMQ (包含交换机和队列) 生产者和消费者、队列我们已经举例过了。这里主要说一下交换机以及虚拟主机 交换机 从这个名称我就可以大致了解到。和网络交换机的概念差不多,网络交换机用来处理以太网数据帧(包) 达到交换转发的目的。很显然,我们这里的交换机也是这样的,用来交换消息,这里需要注意的地方就是 路由键 先来创建一个demo ,里面涉及到的内容,我会这逐一分析 Demo 练习 通过Springboot 整合RabbitMQ的方式来学习MQ 当中的一些交换机类型、以及虚拟主机、绑定等概念 <dependency> <groupId>org.springframework.boot</groupId> <artifactId

上周热点回顾(12.31-1.6)

我是研究僧i 提交于 2021-02-13 19:00:53
热点随笔: · 从软件工程的角度解读任正非的新年公开信 ( 宝玉 ) · .Net Core ORM选择之路,哪个才适合你 ( fly-小文子 ) · 为自己搭建一个分布式 IM(即时通讯) 系统 ( crossoverJie ) · 十大经典排序算法动画与解析,看我就够了!(配代码完全版) ( 五分钟学算法 ) · surging 微服务引擎 1.0 正式发布 ( fanly11 ) · 再见,2018。你好,2019。 ( Lemon丶 ) · 中小研发团队架构实践之生产环境诊断工具WinDbg ( arch-system ) · 2019年目标 ( Mr.zou ) · 设计,架构,框架之间是什么关系? ( YOYO&# ) · 三分钟学会.NET微服务之Polly ( 张子浩 ) · 做开发十年,我总结出了这些开发经验 ( 腾讯云+社区 ) · 是时候给大家介绍 Spring Boot/Cloud 背后豪华的研发团队了。 ( 纯洁的微笑 ) 热点新闻: · 我如何成了腾讯架构调整的炮灰 · 支付宝:蚂蚁森林已经种下5552万棵真树 · 靠传销和知识付费穿不过焦虑这片海 · 跌了2个京东,又跌了2个小米,苹果手机终于卖不动了 · 这一刻,世界看中国!嫦娥四号代表人类首登月背! · 2018年AI圈造假事件:罗生门此起彼伏,比娱乐圈精彩 · 10位创业者口述裁员故事:对不起

Spring boot下@Autowired 注入为 NULL的问题

空扰寡人 提交于 2021-02-13 14:05:34
问题描述: 在springboot项目中集成quartz时,需要使用到一个import org.springframework.scheduling.quartz.SchedulerFactoryBean这个类,并需要自动注入,在测试代码时,发现无法注入到普通.class文件中,后台报错提示:空指针异常。通过断电调试,发现时SchedulerFactoryBean这个类为NULL。 问题解决方案: 1.根据springboot 框架的注入方式检查,@Autowired 注解正确,因为引用的框架本身的类,不需要在SchedulerFactoryBean类文件上加上@Component,所以本身没错。 2.采用另外的方式进行解决: @Autowired private SchedulerFactoryBean schedulerFactoryBean; private static QuartzManager quartzManager; /** * 通过@PostConstruct实现初始化bean之前进行的操作 * @desc 初始化操作,得到QuartzManager实例 * @Date 2019年1月7日 */ @PostConstruct public void init() { quartzManager = this ; quartzManager

微信小程序登录JAVA后台

南笙酒味 提交于 2021-02-13 09:33:01
代码地址如下:<br> http://www.demodashi.com/demo/12736.html 登录流程时序登录流程时序 具体的登录说明查看 小程序官方API 项目的结构图: springboot项目搭建 使用idea作为开发工具,由gradle构建项目,搭建springboot项目,对这块儿不熟悉的可以自行去学习,此处不多赘述。下面是核心的配置文件。application.yml中配置springboot默认的参数,application.properties配置自定义的参数,可以统一配置在一个文件中,依据个人习惯。 buidle.gradle配置 buildscript { ext { springBootVersion = '1.5.10.RELEASE' } repositories { mavenLocal() maven { url 'http://maven.aliyun.com/nexus/content/groups/public' } mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'org

spring boot 跨域 Cors

无人久伴 提交于 2021-02-13 08:51:41
原文链接: spring boot 跨域 Cors 全局配置 简单添加配置类 @Configuration public class MyWebAppConfigurer extends WebMvcConfigurerAdapter{ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } 设置详细信息 @Configuration public class MyWebAppConfigurer extends WebMvcConfigurerAdapter{ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://192.168.1.97") .allowedMethods("GET", "POST") .allowCredentials(false).maxAge(3600); } 局部配置 在controller 或者方法上添加注解 @CrossOrigin(origins = "http://192.168.1.97:8080", maxAge = 3600) 来源: