使用三方jar中的@RestControllerAdvice不起作用
背景
公司封装了自己的基础核心包core-base,里边包含了Validation的异常捕获处理类;同时开发项目有全局异常捕获处理类,经测试发现,core-base里边的不起作用
可能原因:
- 未扫描外部依赖包
- 标注@RestControllerAdvice的类,他们会依次加载,遇到异常时,按照类加载顺序进行判断,如果前面的类有能处理这个异常的方法,就给前面的类处理
解决
- 使用@ComponentScan()扫描
- 设置加载优先级,@Order注解标注或实现Ordered接口,重写getOrder()方法;
@Order(Ordered.HIGHEST_PRECEDENCE) // order如果不标注数字,默认最低优先级,因为其默认值是int最大值
常用Validation异常处理配置
- 多个参数校验时,默认返回所有的错误结果,如果只返回第一个校验失败的结果,可通过get(0)获取第一个,或者通过编写配置就可以实现
import com.dangbo.entity.ResultDTO;
import com.dangbo.enums.ResultCode;
import java.util.stream.Collectors;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ValidationExceptionHandler {
@ExceptionHandler({MethodArgumentNotValidException.class})
public ResultDTO MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
String messages = fieldErrors.stream()
.map(o -> o.getDefaultMessage())
.collect(Collectors.joining(","));
return ResultDTO.error(ResultCode.HTTP_INTERNAL_SERVER_ERROR, messages);
}
@ExceptionHandler({BindException.class})
public ResultDTO BindExceptionHandler(BindException e) {
List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
// 多个参数校验时,默认返回所有的错误结果
String messages = fieldErrors.stream()
.map(o -> o.getDefaultMessage())
.collect(Collectors.joining(","));
return ResultDTO.error(ResultCode.HTTP_INTERNAL_SERVER_ERROR, messages);
}
@ExceptionHandler({ConstraintViolationException.class})
public ResultDTO ConstraintViolationExceptionHandler(ConstraintViolationException e) {
Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
String messages = constraintViolations.stream()
.map(o -> o.getMessage())
.collect(Collectors.joining(","));
return ResultDTO.error(ResultCode.HTTP_INTERNAL_SERVER_ERROR, messages);
}
}
// 通用配置
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
/**
* validate参数校验默认的是一个参数校验失败后,还会继续校验后面的参数
* 通过这个配置改成:校验参数时只要出现校验失败的情况,就立即抛出对应的异常,结束校验,不再进行后续的校验
*/
@Configuration
public class ValidationConfig {
@Bean
public Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
//failFast的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验。
.failFast(true)
.buildValidatorFactory();
return validatorFactory.getValidator();
}
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setValidator(validator());
return methodValidationPostProcessor;
}
}
参考:https://www.cnblogs.com/chongcheng/p/13058345.html
使用三方jar中的@RestControllerAdvice不起作用的更多相关文章
- 在JAR中打包使用JAR库
不知大家在写Java程序的时候有没有这种需求: 将引用其他第三方JAR库的项目打包成一个JAR文件执行.也就是说在你打包好的JAR文件里再包括那些你引用的第三方JAR文件,合成一个JAR包,这样仅仅需 ...
- 不要轻易在java ext 目录放任何三方jar包
今天在编写一个简单spi 应用demo的时候,在编译时总有一个其他的错误,如下: ERROR Failed to execute goal org.apache.maven.plugins:maven ...
- springboot引用三方jar包
在springboot项目中可能会用到三方工具类(比如接入短信网关时给出的工具jar包),这时候需要在springboot项目中手动引入进来 1. springboot工程目录, lib/ucpaas ...
- springboot 打包问题 项目依赖三方jar ,之前的同事是直接丢到项目lib下 ,今天使用springbioot打包的时候,找不到这个jar
试了很多种方法 最后还是老老实实按照maven 那种格式把三方jar(或者很难下载下来的那种jar) 打包成仓库哪种格式 mvn install:install-file -Dfile=C:\User ...
- Java ClassLoader基础及加载不同依赖 Jar 中的公共类
转载自:最新内容及最清晰格式请见 http://www.trinea.cn/android/java-loader-common-class/ 本文主要介绍 ClassLoader 的基础知识,Cla ...
- 修改jar中的class文件
在工作中有可能会遇到需要修改jar的情况.正常情况下,如果有源代码的话,就比较容易,直接修改源代码,再导出新的jar文件即可.但是如果没有源代码就比较麻烦了,下面记录了没有源代码的情况修改jar的方法 ...
- java中文件的相对路径以及jar中文件的读取
Java中File类的构造函数需要我们传入一个pathname,当我们传入以"/"开头的pathname表示绝对路径,其他均表示相对路径. 一:绝对路径名:是完整的路径名,不需要任 ...
- springmvc获取jar中的静态资源与jar包中的资源互相引用问题
1.首先看jar中的文件位置 2.在web工程中引用该jar 并且在springmvc文件中配置路径 如果有多个路径可用逗号隔开 3.在web工程找jsp页面如何引用 这样就可以了 关于jar中的资源 ...
- Maven把项目依赖的所有jar包都打到同一个jar中
目录 1 使用maven-shade-plugin 2 推荐: 使用maven-assembly-plugin 3 扩展: Maven安装本地jar包到本地仓库 4 扩展: 手动生成jar包 5 扩展 ...
- maven笔记-将本地jar包打包进可执行jar中
参考资料:http://www.cnblogs.com/richard-jing/archive/2013/01/27/Maven_localjar.html 使用本地jar <dependen ...
随机推荐
- Go--发起HTTP请求
一.HTTP请求 根据 HTTP 标准,HTTP 请求可以使用多种请求方法.在日常开发中大多数会用到 5 种请求方法: GET.POST.PUT.PATCH 和 DELETE 方法 描述 GET 请求 ...
- PS 独立集中标识下修改项目采购类型增强
1.当物料独立集中标识为2,采购类型通过BAPI:BAPI_NETWORK_COMP_ADD,type_of_pur_resv传入'7',则报错"组件分配并不是未销售订单或项目库存而设的&q ...
- SpringBoot 项目实战 | 瑞吉外卖 Day03
该系列将记录一份完整的实战项目的完成过程,该篇属于第三天 案例来自B站黑马程序员Java项目实战<瑞吉外卖>,请结合课程资料阅读以下内容 该篇我们将完成以下内容: 公共字段自动填充 新添分 ...
- Codeforces Round #620 (Div. 2) (A~D)
比赛链接:Here A题挺水的就不写了 1304B - Longest Palindrome 题意: 输入 \(m\) 个长度为 \(n\) 的字符串,问这些字符串能组成的最长回文串有多长. 思路: ...
- 阿里云蝉联 FaaS 领导者,产品能力获最高分
日前,权威咨询机构 Forrester 发布 The Forrester Wave: Functions-As-A-Service Platforms, Q2 2023.阿里云凭借函数计算的产品能力在 ...
- element-plus-admin学习笔记
https://toscode.gitee.com/hsiangleev/element-plus-admin
- Visual Studio2019 使用WCF服务
什么是WCF Windows Communication Foundation (WCF) 是一个框架,用于生成面向服务的应用程序.它取代了较旧的进程间通信技术,例如 ASMX Web 服务..NET ...
- Kubernetes 内存资源限制实战
本文转载自米开朗基扬的博客 1. Kubernetes 内存资源限制实战 Kubernetes 对内存资源的限制实际上是通过 cgroup 来控制的,cgroup 是容器的一组用来控制内核如何运行进程 ...
- docker 安装 ETCD 及 etcd 使用
本文为博主原创,未经允许不得转载: etcd 是 CoreOS 团队发起的一个开源项目(Go 语言,其实很多这类项目都是 Go 语言实现的,只能说很强大),实现了分布式键值存储和服务发现,etcd 和 ...
- 问题--C++单例模式中唯一对象初始化时关于在类外调用私有的无参构造问题
1.问题 在单例模式中初始化单例对象Person* Person::signal= new Person; 这一步在类外,而new Person需要调用私有的无参构造,但是只有在类内部才能调用私有函数 ...