我是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});
}
编辑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,内