簡體   English   中英

Spring AOP @Pointcut不觸發@Before方法

[英]Spring AOP @Pointcut not triggering @Before method

我有一個@Aspect和@Pointcut方法,其注釋為在@Controller請求方法之前觸發@Before,它似乎是匹配的(因為我沒有收到任何錯誤),但它根本沒有觸發我的建議方法。 我將測試的切入點更改為盡可能具體,並且在應用程序啟動期間未遇到任何綁定錯誤。

這是我的控制器方法(該類是com.xyzMyController ):

@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類:

@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;
    }
}

原來@Pointcut行並不完全正確。 變更:

.. submitMethod(*.SubmissionRequest,*.HttpServletRequest,*.BindingResult) ..

對三個對象中的每個對象使用相同的args過濾器來submitMethod(..)或使用完全限定的類名,則建議可以鎖定我想要建議的不同方法。 我還是放棄了一點方法,並創建了一個自定義批注,以直接表示我想建議哪種方法,並最終切入了最后一個切入點:

@Pointcut("@annotation(com.xyzannotation.SpecificTypeOfRequestValidation) && args(request, httpRequest, result)")

如果您使用的是Spring 4,則可以全部使用@ControllerAdvice注釋集中所有請求驗證,從維護角度來看,這似乎更有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM