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

Spring AOP@在建议返回值之前

商昆琦
2023-03-14

我是Spring AOP的新手,我想知道是否有可能将@Before中的值返回给方法,并在其中使用这个变量,例如:

@Before("@annotation(CheckUserReservationPermission) && args(username,idReservation)")
public Reservation userCreationAdvice(ProceedingJoinPoint pjp, String username, Integer idReservation) throws Throwable {
    Reservation reservation = reservationServices.findById(idReservation);
    if (!reservation.getUser().getUsername().equals(username))
        throw new PermissionException("You can't delete the reservation with id: " + idReservation);
    return reservation;
}

而我的方法:

@Override
@CheckUserReservationPermission
public void deleteReservationById(String username, Integer idReservation) throws QueryException {
    synchronized(ReservationsSchedulerServicesImpl.class){
        databaseReservationServices.deleteReservationById(username, reservation);  
    }
}

有办法做到这一点吗?否则我必须重复这个问题。谢谢

更新:使用@Around我可能有这个代码,但是如何将变量检索到deleteReservationById方法中?

@Around("@annotation(CheckUserReservationPermission) && args(username,idReservation)")
public Object userCreationAdvice(ProceedingJoinPoint pjp, String username, Integer idReservation) throws Throwable {
    Reservation reservation = reservationServices.findById(idReservation);
    if (!reservation.getUser().getUsername().equals(username))
        throw new PermissionException("You can't delete the reservation with id: " + idReservation);
    return pjp.proceed(new Object[] {reservation});
}

共有1个答案

韦辰钊
2023-03-14

编辑2:

>

@Around("@annotation(CheckUserReservationPermission) && args(username,idReservation)")
public Object userCreationAdvice(ProceedingJoinPoint pjp, DeleteByIdRequest req) throws Throwable {
    Reservation reservation = reservationServices.findById(idReservation);
    if (!reservation.getUser().getUsername().equals(username)) {
        throw new PermissionException("You can't delete the reservation with id: " + idReservation);}

     req.setReservation(reservation);  
    return pjp.proceed(new Object[] {req});

}

2.新请求POJO

 class DeleteByIdRequest {
      Reservation reservation;
      String username;
      Integer idReservation;
    }

3.目标方法

@Override
@CheckUserReservationPermission
public void deleteReservationById(DeleteByIdRequest request) throws QueryException {
    synchronized(ReservationsSchedulerServicesImpl.class){
        databaseReservationServices.deleteReservationById(username, reservation);  
    }
}

请参阅此建议的界面,

检查他们返回的内容。

1.投掷建议

public void afterThrowing(IllegalArgumentException e) throws Throwable {
}

2.返回后的建议

public void afterReturning(Object returnValue, Method method,
        Object[] args, Object target) throws Throwable {
}

3.事先建议

public void before(Method method, Object[] args, Object target)
        throws Throwable {

}

4.方法拦截器(围绕建议)

public Object invoke(MethodInvocation methodInvocation) throws Throwable {

}

若你们在第四点中注意到,只有在“建议”周围才是“返回对象”。

你必须定义连接点。继续()以控制拦截器何时将控件返回到原始方法。

检查这里的简单示例

编辑:我认为这可以通过继续使用参数来实现
基本上你可以用新参数调用procedure()。

 类似资料:
  • 一些日志记录需要在类的静态方法执行前后完成。我试图使用Spring AOP实现这一点,但它不起作用,对于普通方法来说,它是起作用的。请帮助我理解如何实现这一点,如果可以使用注释来完成,那就太好了。

  • 在集成测试中,我的建议被错误执行,而在测试中我模拟它以抛出TimeoutException,并且传递给方面的参数为null。 我的建议是: 我的测试: 由于NPE(订单为空),此测试失败。 在调试中,我发现当我进行模拟时,我已经执行了建议,此时,还没有值,为空,所以NPE。但我不认为这些建议应该在嘲笑的时候执行。测试时如何避免这种情况??这对我来说太荒谬了。

  • 问题内容: 我刚遇到一个错误。 当我尝试分配这样的对象时: 我得到的错误是“不赞成通过引用分配new的返回值”。实际上,我一直在寻找解决方案,但是我唯一看到的就是拒绝php.ini的政策(error_reporting)。我也尝试过,但是没有用。 真令人困惑。希望您能帮助我。提前致谢。 问题答案: 在PHP5中,不赞成使用这种用法 您确定您没有在示例代码中漏号吗?这将生成您声明的警告,但是它不是必

  • 问题内容: 我正在阅读一些hibernate教程,并陷入default_batch_fetch_size的问题。阅读有关“可以在性能敏感的应用程序中使用Hibernate吗?”的专家评论清楚地解释了其重要性,但是我试图理解为什么在链接中使用推荐值4、8、16或32。 问候 问题答案: 我们正在生产中使用。因此,在某些情况下,我们有3个查询而不是300个查询,因此对于我们的数据库来说是一个很好的性能

  • 问题内容: 在运行该行之后,在指令指针返回到调用函数之前,是否可以看到方法的返回值? 我正在调试无法修改的代码 (阅读:不想重新编译第三方库) ,有时它会跳转到我没有源代码的代码,或者return表达式具有使我无法继续工作的副作用只需在“ 显示” 标签中运行表达式即可。 通常在复合语句中使用返回值,因此 Variables 视图将永远不会向我显示该值(因此希望在控件返回到调用函数之前先查看结果)。

  • 根据函数或者结构体方法的返回值,returnHandle 插件将自动将内容写入到 ResponseWriter. 目前支持的返回值及对应的行为如下: string 返回string,将会把string转为[]byte同时写入到ResponseWriter []byte 返回[]byte将会直接写入ResponseWriter error 返回错误,如果error不为nil, 则写入返回头500,内