0
回答
面向切面是否可以修改@Around 中的返回值
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
@Around("pointCut()")
	public Object applaud(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("around start.."); 
		Map<String, Object> map = new HashMap<String, Object>();
		try {
			//获取原始返回值
			map.put("value", pjp.proceed());
			map.put("states", true);
			String methodName = pjp.getSignature().getName(); 
			System.out.println("The method " + methodName + " begins with " + Arrays.asList(pjp.getArgs()));
			System.out .println("The method " + methodName + " ends with " + map);
		} catch (Throwable ex) {
			System.out.println("error in around");
			throw ex;
		}
		System.out.println("around end");
		return map;
	}

最终方案如下:

	@Around("pointCut()")
	public Object applaud(ProceedingJoinPoint pjp) throws Throwable { 
		ModelMap map ;
		try {
			//获取原始返回值 
			 map = (ModelMap) pjp.proceed();    
			 map.put("states", true);  
		} catch (Throwable ex) {
			map =new ModelMap();
			map.put("err", ex.getMessage()); 
		} 
		return  map;
	}



public ModelMap  addDo(Friend friend) {
	this.friends.add(friend);
	ModelMap map=new ModelMap();
	map.addAttribute("value", friend);
	return map;
}
 

public ModelMap delDo(Friend friend) throws Exception {
	ModelMap map=new ModelMap();
	if(true){
		throw new Exception("錯誤的參數");
	} 
	return map;
}



测试结果:

around start..
The method addDo ends with {value=Friend [name=李梅, sex=女, age=18]}
around end
最终返回{value=Friend [name=李梅, sex=女, age=18], states=true}
around start..
error in around
around end
最终返回{err=錯誤的參數}


<无标签>
举报
LikesWinds
发帖于2年前 0回/68阅

以下是问题补充:

  • @LikesWinds :修改返回值是希望为真正的返回值添加一些辅助信息。 如原返回对象为 user 经过包装后为 {states:"true" value:user } 或者{states:"false"; errCode:"0000101"; errMsg:"系统错误" } 其中的错误代码,错误消息来源于切点中抛出的自定义异常 (2年前)
  • @LikesWinds :问题已解决,经测试,被织入的方法的返回值必须要和截取的方法一样,而不能直接用object,否则无法重新赋值。详细过程如评论 (2年前)
顶部