文档章节

Springboot 利用Aspect 解决NULL 返还为""

r
 reasahi
发布于 2017/05/15 11:41
字数 465
阅读 27
收藏 0

废话就不多说了直接上代码:

/**
 * Controller层AOP,记录请求和返回结果日志扫描controller日志
 *
 * @author reasahi
 * @version 1.0.0
 */
@Aspect
@Component
public class WebLogAspect {

    /**
     * 日志
     */
    private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
    @Resource
    private MappingJackson2HttpMessageConverter converter;

    /**
     * 同步计算每次请求时间
     */
    ThreadLocal<Long> startTime = new ThreadLocal<>();
// 要扫描多个Controller  使用这种方式进行处理,如果你的包里面分了多个Controller;如果只有一个删除一个execution留一个就行了
    @Pointcut("execution(public * com.exclmpl.controller.*.*(..)) || execution(public * com.exclmpl.webController.*.*(..))")
    public void webLog() {
    }

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        startTime.set(System.currentTimeMillis());
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                .getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 记录下请求内容
        logger.info("请求连接 : " + request.getRequestURL().toString());
        logger.info("请求方式 : " + request.getMethod());
        logger.info("请求IP: " + IpHost.getIpAddr(request));
        logger.info("请求类: " + joinPoint.getSignature().getDeclaringTypeName() + "."
                + joinPoint.getSignature().getName());
        // logger.info("请求参数 : " + params);
        logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
    }

    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        logger.info("请求返还内容 : " + ret);
        logger.info("耗时 : " + (System.currentTimeMillis() - startTime.get()) + "毫秒");
    }


    @Around(value = "webLog()")
    @ResponseBody
    public void formatResult2JSON(ProceedingJoinPoint pjp) throws Throwable {

        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
        HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
        //移除所有字段为null的字段,其实就是使用了toString 之后移除 所有的null字段,但是这样处理的后果就是所有返还字段内不能带有null这样小写的字段,否则将会全部被移替换掉
        String result=pjp.proceed().toString().replaceAll("null", "\"\"");
        converter.write(JSONObject.fromObject(result), MediaType.APPLICATION_JSON_UTF8, outputMessage);
        shutdownResponse(response);
    }

    @AfterThrowing(pointcut = "webLog()", throwing = "error")
    public void handleForException(JoinPoint jp, Throwable error) throws Throwable {
        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
        HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
//这里可能会报错,原因是因为你在 try ctah模块里面用
e.printStackTrace();

如果你不需要正式环境下有这个,那么最好注销或者使用e.getMessage();

converter.write(JSONObject.fromObject(error.getMessage()), MediaType.APPLICATION_JSON_UTF8, outputMessage);
        shutdownResponse(response);
    }

    private void shutdownResponse(HttpServletResponse response) throws IOException {
        response.getOutputStream().close();
    }
}

© 著作权归作者所有

共有 人打赏支持
r
粉丝 0
博文 7
码字总数 5042
作品 0
昆明
后端工程师
10分钟入门SpringBoot

SpringBoot是基于spring框架衍生的一种新的微服务框架,如果对Spring有一定了解的同学肯定知道在Spring中需要配置各种xml文件完成bean的注册操作,随着服务越来越多,配置就变得越来越复杂,...

jwfy
06/14
0
0
学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow
05/28
0
0
springboot的后台系统的初步搭建

springboot的后台系统的初步搭建 基于springboot的设备管理系统的架构搭建 使用工具:idea 数据库:mysql 相关技术:shiro mybatis activemq等 (1) 新建项目 new project ,idea有专门的sprin...

代金券优惠
04/15
0
0
SpringBoot 2.0 系列001 -- 入门介绍以及相关概念

SpringBoot 2.0 系列001 -- 入门介绍以及相关概念 什么是SpringBoot? 项目地址:http://projects.spring.io/spring-boot/ SpringBoot介绍 Spring Boot使开发独立的,产品级别的基于Spring的...

路上有你0314
05/10
0
0
Regan_API_SpringBoot 一个基于注释生成JAVA API文档的接口平台

ReganAPISpringBoot 项目介绍 ReganAPISpringBoot 文档项目Regan API 项目是基于注释自动生成api文档,很大缩短了开始与后期维护API接口文档的时间。Regan API 利用jdk提供的Doclet类读取文档...

Jeff_Regan
08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SQL count(*) 和count(1)的区别

开发中经常会使用这两个聚合函数,作用都是用来统计记录行,今天查找资料发现,其实这两个函数并没有区别, 实践才是检验的标准,首先看执行计划(表是我自己建立的): 可以看到,两个执行计...

一曲图森破
27分钟前
1
0
ppwjs之bootstrap文字排版:字体设置

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
30分钟前
1
0
区块链100讲:详解区块链之P2P网络

1 P2P网络 如果我们简单来看 P2P 技术,它的应用领域已经非常广泛了,从流媒体到点对点通讯、从文件共享到协同处理,多种领域都有它的身影出现。 同样的,P2P 的网络协议也有很多,比较常见的...

HiBlock
45分钟前
0
0
74.expect脚本同步文件以及指定host同步文件 构建分发系统文件和命令

20.31 expect脚本同步文件: 在expect脚本中去实现在一台机器上把文件同步到另外一台机器上去。核心命令用的是rsync ~1.自动同步文件 #!/usr/bin/expect set passwd "123456" spawn rsync -a...

王鑫linux
今天
1
0
TypeScript项目引用(project references)

转发 TypeScript项目引用(project references) TypeScript新特性之项目引用(project references) 项目引用是TypeScript 3.0中的一项新功能,允许您将TypeScript程序构建为更小的部分。 通过这...

durban
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部