文档章节

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

r
 reasahi
发布于 2017/05/15 11:41
字数 465
阅读 30
收藏 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
Inferred type 'S' for type parameter 'S' is not within its bound;

在使用springboot 方法报错: Inferred type 'S' for type parameter 'S' is not within its bound; should extends xxxxxx 解决方法: 1、springboot 版本问题,将 2.0.1 版本换成 1.5.4 版......

颖辉小居
06/06
0
0
学习 Spring Boot 知识看这一篇就够了

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

ityouknow
05/28
0
0
补习系列-springboot 实现拦截的五种姿势

目录 简介 姿势一、使用 Filter 接口 1. 注册 FilterRegistrationBean 2. @WebFilter 注解 姿势二、HanlderInterceptor 姿势三、@ExceptionHandler 注解 姿势四、RequestBodyAdvice/Respons...

美码师
08/18
0
0
Spring Boot学习笔记

RabbitMQ RabbitMQ 安装 linux安装RabbitMQ详细教程 Ubuntu 16.04 RabbitMq 安装与运行(安装篇) ubantu安装rabbitMQ步骤 多线程 Spring @transactional注解和synchronized同步锁同时使用不...

OSC_fly
07/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于《红楼梦》的读后感优秀范文2000字

关于《红楼梦》的读后感优秀范文2000字: (在写读《红楼梦》有感的路上遇到了博友“五音不全”师兄,使我感到汗颜,于是放弃了87版的电视剧,只读原著《红楼梦》和五音的评红作品,对原著才...

原创小博客
18分钟前
1
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
21分钟前
1
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
2
0
Docker搭建代码质量检测平台-SonarQube(中文版)

Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量。通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言...

Jacktanger
今天
2
0
Windows / Linux / MacOS 设置代理上网的方法汇总

本文汇总了 Windows / Linux / MacOS 设置代理上网的各种方法,总结如下: 1、设置系统代理(Windows、Linux、MacOS) 2、设置代理插件(Chrome、Chromium、Firefox、Opera、QQ等浏览器) 3、...

sunboy2050
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部