如何在Spring AOP中提取变量值

时间:2017-08-07 06:12:00

标签: java spring spring-aop

身份验证方法已与API中的每个REST调用集成在一起。我一直在尝试通过Spring AOP实现一个身份验证方法,以便我可以从端点中删除所有重复的代码,并且只有一个建议来查找控制器中的所有公共方法。

请检查下面的代码,

@Aspect
public class EndpointAccessAspect {
/**
 * All the request mappings in controllers need to authenticate and validate end-point access
 */

@Before("execution(public * com.xxxx.webapi.controllers.MenuController.getCategory(HttpServletRequest)) && args(request)")
public void checkTokenAccess(HttpServletRequest request){
    String re =(String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
 System.out.println(" %%%%%%%%%%%%%%%%%%% checkTokenAccess %%%%%%%%%%%%%%%" + re);
}

public void checkEndPointPermission(){
    System.out.println(" $$$$$$$$$$$$$$$$$$ checkEndPointPermission &&&&&&&&&&&&&");
}

}

但是,我看到Intelij在getCategory(HttpServletRequest)) && args(request)附近发出错误,说无法解析符号HttpServletRequest。我需要请求每个REST端点。该方法中的变量多于HttpServletRequest变量,但只需要该变量。

当我测试功能时,代码正在编译,我注意到它没有达到建议。任何人都可以帮我解决这个问题吗? 我从Spring文档中找到了这个 Spring doc

  

任何连接点(仅在Spring AOP中执行的方法)需要一个   单个参数,以及运行时传递的参数   序列化

这是否意味着我不能使用具有多个参数的方法?

控制器端点

@RequestMapping(value = "{menuId}/categories/{categoryId}", method = RequestMethod.GET)
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Successful retrieval of a category requested", response = ProductGroupModel.class),
            @ApiResponse(code = 500, message = "Internal server error") })
    public ProductGroupModel getCategory(
            @ApiParam(name = "menuId", value = "Numeric value for menuId", required = true) @PathVariable(value = "menuId") final String menuId,
            @ApiParam(name = "categoryId", value = "Numeric value for categoryId", required = true) @PathVariable(value = "categoryId") final String categoryId,
            final HttpServletRequest request) {

1 个答案:

答案 0 :(得分:0)

以下语法解决了上述问题。基本上,我不得不修改代码来处理建议中的多个参数。

@Before("execution(public * com.xxxx.webapi.controllers.MenuController.getCategory( HttpServletRequest,..)) && args(request, ..)")
public void checkTokenAccess(HttpServletRequest request){
    String re =(String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
 System.out.println(" %%%%%%%%%%%%%%%%%%% checkTokenAccess %%%%%%%%%%%%%%%" + re);
}