Merge remote-tracking branch 'origin/dev' into satoken

# Conflicts:
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
#	ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
#	ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java
#	ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java
#	ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java
#	ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java
#	ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
#	ruoyi-framework/src/main/java/com/ruoyi/framework/mybatisplus/CreateAndUpdateMetaObjectHandler.java
#	ruoyi-framework/src/main/java/com/ruoyi/framework/security/filter/JwtAuthenticationTokenFilter.java
#	ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/AuthenticationEntryPointImpl.java
#	ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java
#	ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java
#	ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java
#	ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java
#	ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java
#	ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java
#	ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java
This commit is contained in:
疯狂的狮子li
2021-10-27 13:16:19 +08:00
418 changed files with 43660 additions and 4512 deletions

View File

@ -0,0 +1,85 @@
package com.ruoyi.framework.Interceptor;
import cn.hutool.core.map.MapUtil;
import com.alibaba.ttl.TransmittableThreadLocal;
import com.ruoyi.common.utils.JsonUtils;
import com.ruoyi.common.utils.StringUtils;
import com.yomahub.tlog.context.TLogContext;
import com.yomahub.tlog.web.interceptor.AbsTLogWebHandlerMethodInterceptor;
import com.yomahub.tlog.web.wrapper.RequestWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.StopWatch;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* 重写Tlog web的调用时间统计拦截器
*
* @author Lion Li
* @since 3.3.0
*/
@Slf4j
public class PlusWebInvokeTimeInterceptor extends AbsTLogWebHandlerMethodInterceptor {
private final TransmittableThreadLocal<StopWatch> invokeTimeTL = new TransmittableThreadLocal<>();
@Override
public boolean preHandleByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (TLogContext.enableInvokeTimePrint()) {
String url = request.getMethod() + " " + request.getRequestURI();
// 打印请求参数
if (isJsonRequest(request)) {
String jsonParam = new RequestWrapper(request).getBodyString();
log.info("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam);
} else {
Map<String, String[]> parameterMap = request.getParameterMap();
if (MapUtil.isNotEmpty(parameterMap)) {
String parameters = JsonUtils.toJsonString(parameterMap);
log.info("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters);
} else {
log.info("[PLUS]开始请求 => URL[{}],无参数", url);
}
}
StopWatch stopWatch = new StopWatch();
invokeTimeTL.set(stopWatch);
stopWatch.start();
}
return true;
}
@Override
public void postHandleByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletionByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
if (TLogContext.enableInvokeTimePrint()) {
StopWatch stopWatch = invokeTimeTL.get();
stopWatch.stop();
log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime());
invokeTimeTL.remove();
}
}
/**
* 判断本次请求的数据类型是否为json
*
* @param request request
* @return boolean
*/
private boolean isJsonRequest(HttpServletRequest request) {
String contentType = request.getContentType();
if (contentType != null) {
return StringUtils.startsWithIgnoreCase(contentType, MediaType.APPLICATION_JSON_VALUE);
}
return false;
}
}

View File

@ -37,13 +37,13 @@ public class RateLimiterAspect {
}
long number = RedisUtils.rateLimiter(combineKey, rateType, count, time);
if (number == -1) {
throw new ServiceException("访问过于频繁,请稍再试");
throw new ServiceException("访问过于频繁,请稍再试");
}
log.info("限制令牌 => {}, 剩余令牌 => {}, 缓存key => '{}'", count, number, combineKey);
} catch (ServiceException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException("服务器限流异常,请稍再试");
throw new RuntimeException("服务器限流异常,请稍再试");
}
}

View File

@ -17,7 +17,9 @@ import java.util.concurrent.TimeUnit;
* openfeign配置类
*
* @author Lion Li
* @deprecated 由于使用人数较少 决定与 3.4.0 版本移除
*/
@Deprecated
@EnableFeignClients("${feign.package}")
@Configuration
@ConditionalOnClass(Feign.class)

View File

@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.ruoyi.common.core.mybatisplus.methods.InsertAll;
import com.ruoyi.framework.mybatisplus.CreateAndUpdateMetaObjectHandler;
import com.ruoyi.framework.handler.CreateAndUpdateMetaObjectHandler;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -18,13 +18,12 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.util.List;
/**
* mybatis-plus配置类
* mybatis-plus配置类(下方注释有插件介绍)
*
* @author Lion Li
*/
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
// 指定要扫描的Mapper类的包的路径
@MapperScan("${mybatis-plus.mapperPackage}")
public class MybatisPlusConfig {
@ -35,14 +34,11 @@ public class MybatisPlusConfig {
interceptor.addInnerInterceptor(paginationInnerInterceptor());
// 乐观锁插件
interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
// 阻断插件
// interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
return interceptor;
}
/**
* 分页插件,自动识别数据库类型
* https://baomidou.com/guide/interceptor-pagination.html
*/
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
@ -55,41 +51,13 @@ public class MybatisPlusConfig {
/**
* 乐观锁插件
* https://baomidou.com/guide/interceptor-optimistic-locker.html
*/
public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
return new OptimisticLockerInnerInterceptor();
}
/**
* 如果是对全表的删除或更新操作,就会终止该操作
* https://baomidou.com/guide/interceptor-block-attack.html
*/
// public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
// return new BlockAttackInnerInterceptor();
// }
/**
* sql性能规范插件(垃圾SQL拦截)
* 如有需要可以启用
*/
// public IllegalSQLInnerInterceptor illegalSQLInnerInterceptor() {
// return new IllegalSQLInnerInterceptor();
// }
/**
* 自定义主键策略
* https://baomidou.com/guide/id-generator.html
*/
// @Bean
// public IdentifierGenerator idGenerator() {
// return new CustomIdGenerator();
// }
/**
* 元对象字段填充控制器
* https://baomidou.com/guide/auto-fill-metainfo.html
*/
@Bean
public MetaObjectHandler metaObjectHandler() {
@ -98,7 +66,6 @@ public class MybatisPlusConfig {
/**
* sql注入器配置
* https://baomidou.com/guide/sql-injector.html
*/
@Bean
public ISqlInjector sqlInjector() {
@ -113,6 +80,19 @@ public class MybatisPlusConfig {
}
/**
* PaginationInnerInterceptor 分页插件,自动识别数据库类型
* https://baomidou.com/guide/interceptor-pagination.html
* OptimisticLockerInnerInterceptor 乐观锁插件
* https://baomidou.com/guide/interceptor-optimistic-locker.html
* MetaObjectHandler 元对象字段填充控制器
* https://baomidou.com/guide/auto-fill-metainfo.html
* ISqlInjector sql注入器
* https://baomidou.com/guide/sql-injector.html
* BlockAttackInnerInterceptor 如果是对全表的删除或更新操作,就会终止该操作
* https://baomidou.com/guide/interceptor-block-attack.html
* IllegalSQLInnerInterceptor sql性能规范插件(垃圾SQL拦截)
* IdentifierGenerator 自定义主键策略
* https://baomidou.com/guide/id-generator.html
* TenantLineInnerInterceptor 多租户插件
* https://baomidou.com/guide/interceptor-tenant-line.html
* DynamicTableNameInnerInterceptor 动态表名插件

View File

@ -76,7 +76,7 @@ public class RedisConfig extends CachingConfigurerSupport {
.setConnectionPoolSize(singleServerConfig.getConnectionPoolSize())
.setDnsMonitoringInterval(singleServerConfig.getDnsMonitoringInterval());
}
// 集群配置方式 参考下方注释
RedissonProperties.ClusterServersConfig clusterServersConfig = redissonProperties.getClusterServersConfig();
if (ObjectUtil.isNotNull(clusterServersConfig)) {
// 使用集群模式
@ -123,4 +123,69 @@ public class RedisConfig extends CachingConfigurerSupport {
return new RedissonSpringCacheManager(redissonClient, config, JsonJacksonCodec.INSTANCE);
}
/**
* redis集群配置 yml
*
* --- # redis 集群配置(单机与集群只能开启一个另一个需要注释掉)
* spring:
* redis:
* cluster:
* nodes:
* - 192.168.0.100:6379
* - 192.168.0.101:6379
* - 192.168.0.102:6379
* # 密码
* password:
* # 连接超时时间
* timeout: 10s
* # 是否开启ssl
* ssl: false
*
* redisson:
* # 线程池数量
* threads: 16
* # Netty线程池数量
* nettyThreads: 32
* # 传输模式
* transportMode: "NIO"
* # 集群配置
* clusterServersConfig:
* # 客户端名称
* clientName: ${ruoyi.name}
* # master最小空闲连接数
* masterConnectionMinimumIdleSize: 32
* # master连接池大小
* masterConnectionPoolSize: 64
* # slave最小空闲连接数
* slaveConnectionMinimumIdleSize: 32
* # slave连接池大小
* slaveConnectionPoolSize: 64
* # 连接空闲超时,单位:毫秒
* idleConnectionTimeout: 10000
* # ping连接间隔
* pingConnectionInterval: 1000
* # 命令等待超时,单位:毫秒
* timeout: 3000
* # 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。
* retryAttempts: 3
* # 命令重试发送时间间隔,单位:毫秒
* retryInterval: 1500
* # 从可用服务器的内部列表中排除 Redis Slave 重新连接尝试的间隔。
* failedSlaveReconnectionInterval: 3000
* # 发布和订阅连接池最小空闲连接数
* subscriptionConnectionMinimumIdleSize: 1
* # 发布和订阅连接池大小
* subscriptionConnectionPoolSize: 50
* # 单个连接最大订阅数量
* subscriptionsPerConnection: 5
* # 扫描间隔
* scanInterval: 1000
* # DNS监测时间间隔单位毫秒
* dnsMonitoringInterval: 5000
* # 读取模式
* readMode: "SLAVE"
* # 订阅模式
* subscriptionMode: "MASTER"
*/
}

View File

@ -7,6 +7,8 @@ import cn.dev33.satoken.stp.StpUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.config.properties.SecurityProperties;
import com.ruoyi.framework.Interceptor.PlusWebInvokeTimeInterceptor;
import com.yomahub.tlog.web.interceptor.TLogWebInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -34,6 +36,10 @@ public class ResourcesConfig implements WebMvcConfigurer {
// 注册sa-token的拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 全局链路跟踪拦截器
registry.addInterceptor(new TLogWebInterceptor());
// 全局访问性能拦截
registry.addInterceptor(new PlusWebInvokeTimeInterceptor());
// 注册路由拦截器,自定义验证规则
registry.addInterceptor(new SaRouteInterceptor((request, response, handler) -> {
// 登录验证 -- 排除多个路径
@ -64,7 +70,6 @@ public class ResourcesConfig implements WebMvcConfigurer {
*/
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 设置访问源地址
@ -73,8 +78,12 @@ public class ResourcesConfig implements WebMvcConfigurer {
config.addAllowedHeader("*");
// 设置访问源请求方法
config.addAllowedMethod("*");
// 对接口配置跨域设置
// 有效期 1800秒
config.setMaxAge(1800L);
// 添加映射路径,拦截一切请求
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
// 返回新的CorsFilter
return new CorsFilter(source);
}
}

View File

@ -0,0 +1,49 @@
package com.ruoyi.framework.config;
import com.yomahub.tlog.core.aop.AspectLogAop;
import com.yomahub.tlog.feign.filter.TLogFeignFilter;
import com.yomahub.tlog.spring.TLogPropertyInit;
import com.yomahub.tlog.spring.TLogSpringAware;
import com.yomahub.tlog.springboot.property.TLogProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.annotation.Order;
/**
* 整合 TLog 框架配置
*
* @author Lion Li
* @since 3.3.0
*/
@Order(-999)
@Configuration
@Import(TLogProperty.class)
public class TLogConfig {
@Bean
public TLogPropertyInit tLogPropertyInit(TLogProperty tLogProperty) {
TLogPropertyInit tLogPropertyInit = new TLogPropertyInit();
tLogPropertyInit.setPattern(tLogProperty.getPattern());
tLogPropertyInit.setEnableInvokeTimePrint(tLogProperty.enableInvokeTimePrint());
tLogPropertyInit.setIdGenerator(tLogProperty.getIdGenerator());
tLogPropertyInit.setMdcEnable(tLogProperty.getMdcEnable());
return tLogPropertyInit;
}
@Bean
public TLogSpringAware tLogSpringAware(){
return new TLogSpringAware();
}
@Bean
public AspectLogAop aspectLogAop() {
return new AspectLogAop();
}
@Bean
public TLogFeignFilter tLogFeignFilter() {
return new TLogFeignFilter();
}
}

View File

@ -0,0 +1,89 @@
package com.ruoyi.framework.handler;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import java.util.Date;
/**
* MP注入处理器
*
* @author Lion Li
* @date 2021/4/25
*/
@Slf4j
public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
try {
if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();
Date current = new Date();
// 创建时间为空 则填充
if (ObjectUtil.isNull(baseEntity.getCreateTime())) {
baseEntity.setCreateTime(current);
}
// 更新时间为空 则填充
if (ObjectUtil.isNull(baseEntity.getUpdateTime())) {
baseEntity.setUpdateTime(current);
}
String username = getLoginUsername();
// 当前已登录 且 创建人为空 则填充
if (StringUtils.isNotBlank(username)
&& StringUtils.isBlank(baseEntity.getCreateBy())) {
baseEntity.setCreateBy(username);
}
// 当前已登录 且 更新人为空 则填充
if (StringUtils.isNotBlank(username)
&& StringUtils.isBlank(baseEntity.getUpdateBy())) {
baseEntity.setUpdateBy(username);
}
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
@Override
public void updateFill(MetaObject metaObject) {
try {
if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) metaObject.getOriginalObject();
Date current = new Date();
// 更新时间填充(不管为不为空)
baseEntity.setUpdateTime(current);
String username = getLoginUsername();
// 当前已登录 更新人填充(不管为不为空)
if (StringUtils.isNotBlank(username)) {
baseEntity.setUpdateBy(username);
}
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
/**
* 获取登录用户名
*/
private String getLoginUsername() {
LoginUser loginUser;
try {
loginUser = SecurityUtils.getLoginUser();
} catch (Exception e) {
log.warn("自动注入警告 => 用户未登录");
return null;
}
return loginUser.getUsername();
}
}

View File

@ -1,66 +0,0 @@
package com.ruoyi.framework.mybatisplus;
import cn.hutool.http.HttpStatus;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import java.util.Date;
/**
* MP注入处理器
*
* @author Lion Li
* @date 2021/4/25
*/
@Slf4j
public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
try {
//根据属性名字设置要填充的值
if (metaObject.hasGetter("createTime")) {
this.setFieldValByName("createTime", new Date(), metaObject);
}
if (metaObject.hasGetter("createBy")) {
this.setFieldValByName("createBy", getLoginUsername(), metaObject);
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
updateFill(metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
try {
if (metaObject.hasGetter("updateBy")) {
this.setFieldValByName("updateBy", getLoginUsername(), metaObject);
}
if (metaObject.hasGetter("updateTime")) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
} catch (Exception e) {
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
}
}
/**
* 获取登录用户名
*/
private String getLoginUsername() {
SysUser loginUser;
try {
loginUser = SecurityUtils.getUser();
} catch (Exception e) {
log.warn("自动注入警告 => 用户未登录");
return null;
}
return loginUser.getUserName();
}
}

View File

@ -8,8 +8,8 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.DemoModeException;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.validation.BindException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
@ -22,19 +22,17 @@ import javax.validation.ConstraintViolationException;
/**
* 全局异常处理器
*
* @author ruoyi
* @author Lion Li
*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler
{
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
public class GlobalExceptionHandler {
/**
* 权限校验异常
*/
@ExceptionHandler(NotPermissionException.class)
public AjaxResult handleAccessDeniedException(NotPermissionException e, HttpServletRequest request)
{
public AjaxResult<Void> handleAccessDeniedException(NotPermissionException e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage());
return AjaxResult.error(HttpStatus.HTTP_FORBIDDEN, "没有权限,请联系管理员授权");
@ -66,9 +64,8 @@ public class GlobalExceptionHandler
* 请求方式不支持
*/
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
HttpServletRequest request)
{
public AjaxResult<Void> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());
return AjaxResult.error(e.getMessage());
@ -78,8 +75,7 @@ public class GlobalExceptionHandler
* 业务异常
*/
@ExceptionHandler(ServiceException.class)
public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request)
{
public AjaxResult<Void> handleServiceException(ServiceException e, HttpServletRequest request) {
log.error(e.getMessage(), e);
Integer code = e.getCode();
return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());
@ -89,8 +85,7 @@ public class GlobalExceptionHandler
* 拦截未知的运行时异常
*/
@ExceptionHandler(RuntimeException.class)
public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request)
{
public AjaxResult<Void> handleRuntimeException(RuntimeException e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生未知异常.", requestURI, e);
return AjaxResult.error(e.getMessage());
@ -100,8 +95,7 @@ public class GlobalExceptionHandler
* 系统异常
*/
@ExceptionHandler(Exception.class)
public AjaxResult handleException(Exception e, HttpServletRequest request)
{
public AjaxResult<Void> handleException(Exception e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生系统异常.", requestURI, e);
return AjaxResult.error(e.getMessage());
@ -111,8 +105,7 @@ public class GlobalExceptionHandler
* 自定义验证异常
*/
@ExceptionHandler(BindException.class)
public AjaxResult handleBindException(BindException e)
{
public AjaxResult<Void> handleBindException(BindException e) {
log.error(e.getMessage(), e);
String message = e.getAllErrors().get(0).getDefaultMessage();
return AjaxResult.error(message);
@ -122,7 +115,7 @@ public class GlobalExceptionHandler
* 自定义验证异常
*/
@ExceptionHandler(ConstraintViolationException.class)
public AjaxResult constraintViolationException(ConstraintViolationException e) {
public AjaxResult<Void> constraintViolationException(ConstraintViolationException e) {
log.error(e.getMessage(), e);
String message = e.getConstraintViolations().iterator().next().getMessage();
return AjaxResult.error(message);
@ -132,8 +125,7 @@ public class GlobalExceptionHandler
* 自定义验证异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e)
{
public AjaxResult<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
log.error(e.getMessage(), e);
String message = e.getBindingResult().getFieldError().getDefaultMessage();
return AjaxResult.error(message);
@ -143,8 +135,7 @@ public class GlobalExceptionHandler
* 演示模式异常
*/
@ExceptionHandler(DemoModeException.class)
public AjaxResult handleDemoModeException(DemoModeException e)
{
public AjaxResult<Void> handleDemoModeException(DemoModeException e) {
return AjaxResult.error("演示模式,不允许操作");
}
}