spring aop不能将值传递给自定义参数

时间:2017-02-26 07:51:09

标签: spring-aop

它是一个弹簧启动应用程序,我用aop来捕捉http头,body。我可以为@annotation做一些事情,当抓住http头,body的值时。但是,当我将数据传输到我的自定义参数时,我无法获得。但另一个春季启动应用程序可以转移它。我不知道为什么。

这是定制的@Aspect:

@Component
@Aspect
public class ApiAspect {
@Resource
private HttpServletRequest request;

@Around("@annotation(com.jvbaoji.api.common.ApiAuth)")
public Object aroundAdvice(ProceedingJoinPoint point) throws Throwable {
    Long userId = Optional.ofNullable(request.getHeader("user_id")).map(Long::valueOf).orElse(null);
    final MethodSignature signature = (MethodSignature) point.getSignature();
    final Method method = signature.getMethod();
    final String methodName = method.getName();
    final Class<?>[] parameterTypes = method.getParameterTypes();
    final Annotation[][] parameterAnnotations;
    parameterAnnotations = point.getTarget().getClass().getMethod(methodName, parameterTypes).getParameterAnnotations();
    final Object[] args = point.getArgs();
    for (int i = 0; i < args.length; i++) {
        for (Annotation annotation : parameterAnnotations[i]) {
            if (AuthUserId.class.equals(annotation.annotationType())) {
                args[i] = userId;
                break;
            }
        }
    }
    return point.proceed();
}
}

自定义@interface:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiAuth {
}

参数:

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthUserId {
}

控制器:

@RequestMapping(value = "updateAccount", method = RequestMethod.POST)
@ApiAuth
public JsonNode updateAccount(@AuthUserId Long userId, @ModelAttribute UserAccountVO userAccountVO) {
    userAccountVO.setUserId(userId);
    TransmissionResult result = userWalletService.updateAccount(userAccountVO);
    if (!result.isSuccess()) {
        return responseJsonFactory.createBad(result.getCode(), result.getFailReason());
    }
    return responseJsonFactory.createOk(jsonMapper.convertValue(userAccountVO, JsonNode.class));
}

我在发布http时发现,我可以调试到arg[i]=userId,但是要返回point.proceed(),它会抛出NullException。我@AuthUserId Long userId无法获得返回值。我不知道为什么。

ps:我的春季aop版本是spring-aop-4.1.4.RELEASE.jar在春季启动。

如果你愿意的话,不管你有什么建议。

1 个答案:

答案 0 :(得分:0)

好的,这是我的无知......我错过了添加args继续。

在ApiAspect.class中:

return point.proceed();

return point.proceed(args);