当前位置: 首页 > 知识库问答 >
问题:

Spring AOP@pointcut未触发@before方法

邵捷
2023-03-14

下面是我的控制器方法(类是com.x.y.z.MyController):

@RequestMapping(method = RequestMethod.POST, produces = "application/json", consumes = "application/json")
@ResponseBody
public SubmissionResponse submitMethod(@Valid @RequestBody final SubmissionRequest request, HttpServletRequest httpRequest, BindingResult result)
{
    if (result.hasErrors()) { throw new BadRequestException(result); }

    //  ... do stuff ...
}

以下是方面类:

@Aspect
@Component
public class RequestValidatingAspect
{
    private static final Logger LOGGER = Logger.getLogger(RequestValidatingAspect.class);

    @Inject
    private ClientService clientService;

    @Inject
    private AccountService accountService;

    @Pointcut("execution(* com.x.y.z.MyController.submitMethod(*.SubmissionRequest,*.HttpServletRequest,*.BindingResult)) && args(request, httpRequest, result)")
    private void requestValidation(SubmissionRequest request, HttpServletRequest httpRequest, BindingResult result) {} 

    @Before("requestValidation(request,httpRequest,result)")    
    public void theAdvice(SubmissionRequest request, HttpServletRequest httpRequest, BindingResult result) throws Throwable
    {
        System.out.println("Before - The Advice");
        LOGGER.info("Entering The Advice!");

        if(result.hasErrors()){ throw new BadRequestException(result); }
        // ... do stuff ...

        LOGGER.info("Exiting - The Advice!");
        return;
    }
}

共有1个答案

郎欣然
2023-03-14

原来@pointcut线并不完全正确。变化:

<代码>...submitMethod(*.SubmissionRequest,*.HttpServletRequest,*.BindingResult)..

对于submitmethod(..)或对具有相同args过滤器的三个对象中的每个对象使用完全限定的类名,可以将建议锁定在我想要建议的不同方法上。不过,我最终稍微改变了一下我的方法,创建了一个自定义注释来直接指示我想建议哪些方法,并以最后的切入点结束:

 类似资料:
  • 我使用的是spring boot、kotlin和junit5。我有一个测试类,当我在未触发所有函数之前使用RunWith(SpringRunner::class)@时,但当我删除该类时,它会给lateinit字段带来错误。

  • 我正在尝试将Hystrix断路器包含在一个spring boot应用程序中。我的应用程序是一个标准的spring boot 1.4.1,带有spring-cloud-hystrix v1.2.0应用程序,其中有一个控制器类,它用一个“聚合”方法调用一个服务类。此方法使用内部私有方法在内部调用两个服务。 这是我的服务类: 我的控制器方法是: 我的配置类有以下注释:

  • 问题内容: 尝试使用vue watch方法,但即使使用,它似乎也不会触发某些对象。 在我的组件中,我收到一个数组作为prop,它们是创建以下表单的字段。我可以构建表单并将其动态绑定到一个名为的对象,并且一切正常(我在vue开发工具中看到,甚至可以按计划提交表单作品) 但是我在尝试观察该动态对象的变化时遇到了问题。 问题答案: 来自文档 由于现代JavaScript的局限性(以及Object.obs

  • 我正在尝试使用MethodChannel和Kotlin作为我的语言选择,将Android的Zendesk原生SDK移植到Flatter中。 当我在项目中直接使用Kotlin代码时,它就可以工作了 这个指的是活动,我想应用程序已经在里面了,但是当我试图制作独立的插件时,事情有点不同。我需要实现ActivityAware来获取活动(在flatter插件中获取活动引用)。 https://github.

  • 我正在试验Dynamo db和lambda,并且在以下流程中遇到问题: Lambda A由put to S3事件触发。它获取对象(一个音频文件),计算其持续时间,并在dynamoDB中为每30秒的段写入一条记录。 Lambda B由DynamoDB触发,从S3下载文件并对Dynamo行中定义的30秒记录进行操作。 我的问题是,当我运行这个流时,函数A通过函数B写入Dynamo所需的所有行 似乎没有

  • 我试图使用对基于Tomcat的Jersey应用程序强制执行某些身份验证。我遵循了这份文件。问题:筛选器从未触发 web.xml文件: