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

废话就很少说了直接上代码:web

/**
 * 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();app

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

    private void shutdownResponse(HttpServletResponse response) throws IOException {
        response.getOutputStream().close();
    }
}
相关文章
相关标签/搜索