spring 在@ResponseBody返回json数据前进行全局处理

第一种:@ControllerAdvice   controller增强处理

实现ResponseBodyAdvice<Object>,重写方法beforeBodyWrite

package com.pinyu.miniprogram.global.exception;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import com.pinyu.miniprogram.utils.Token;
import com.pinyu.miniprogram.utils.result.JsonMsg;

/** 
* @author ypp
* 创建时间:2018年10月15日 下午4:06:50 
* @Description: TODO(全局异常处理) 
*/
@ControllerAdvice
public class GlobalControllerAdvice implements ResponseBodyAdvice<Object>{
	
	protected static Logger log=LogManager.getLogger(GlobalControllerAdvice.class);

	/**
     * 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {}
    
    /**
     * 把值绑定到Model中,使全局@RequestMapping可以获取到该值
     * @param model
     */
    @ModelAttribute
    public void addAttributes(Model model) {
//        model.addAttribute("author", "Magical Sam");
    }

    /**
     * 全局异常捕捉处理
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public String errorHandler(Exception ex) {
    	Throwable cause = ex.getCause();
    	if(cause instanceof AuthTokenException){
    		return Token.Error(cause.getMessage());
    	}
    	String sOut = ex.getClass().getName()+"\r\n";
    	StackTraceElement[] trace = ex.getStackTrace();
    	for (StackTraceElement s : trace) {
    		sOut += "\tat " + s + "\r\n";
    	}
        log.error(sOut);
        ex.printStackTrace();
        return JsonMsg.Error("服务器异常,请联系管理员");
    }

	@Override
	public Object beforeBodyWrite(Object body, MethodParameter arg1, MediaType arg2,
			Class<? extends HttpMessageConverter<?>> arg3, ServerHttpRequest arg4, ServerHttpResponse arg5) {
		//可以在此处进行返回数据全局处理,body就是返回数据,还没有经过@ResponseBody处理
		return body;
	}

	@Override
	public boolean supports(MethodParameter arg0, Class<? extends HttpMessageConverter<?>> arg1) {
		return true;// 只有返回true才会继续执行
	}
}

第二种:利用AOP @AfterReturning进行处理

@AfterReturning(returning="result",value="@annotation(com.pinyu.miniprogram.global.ann.RequireToken)")
public Object write(JoinPoint joinPoint,Object result){
	MemberEntity memberEntity=(MemberEntity) result;
	memberEntity.setNickName("我把nickName值给改变了");
	return memberEntity;
}

@AfterReturning有弊端,可以在@responseBody返回数据前获取到返回值,但不能修改String类型等的数据,可以进行set的方式进行修改,不能直接修改!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值