Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 春季AOP“;内;不';我不能用这种方法工作_Java_Spring_Aop_Aspectj - Fatal编程技术网

Java 春季AOP“;内;不';我不能用这种方法工作

Java 春季AOP“;内;不';我不能用这种方法工作,java,spring,aop,aspectj,Java,Spring,Aop,Aspectj,下面是我的自定义注释 @Target({ ElementType.METHOD, ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Transactional(value = TransactionalCode.MANAGER, readOnly = true) public @interface FinanceReadTx { } 我想对“MyAnnotation”做点什么,所以我声明了@Around和如下方法 @Aspect

下面是我的自定义注释

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Transactional(value = TransactionalCode.MANAGER, readOnly = true)
public @interface FinanceReadTx {
}
我想对“MyAnnotation”做点什么,所以我声明了@Around和如下方法

@Aspect
@Component
public class TransactionalInterceptor implements Ordered {
    @Around("within(@org.springframework.transaction.annotation.Transactional *) || " +
            "within(@(@org.springframework.transaction.annotation.Transactional *) *)")
    public Object proceed(ProceedingJoinPoint pjp) throws Throwable {
        try {
            setDbType(pjp);
            Object result = pjp.proceed();
            DataSourceContextHolder.clearDataSourceType();
            return result;
        } finally {
            // restore state
            DataSourceContextHolder.clearDataSourceType();
        }
    }
....
}
以下服务由其他类“自动连接”。所以我认为这不是AOP代理的问题

@Service
public class UnconfirmedReportService {
    private static final int PREVIEW_SIZE = 8;
    @Autowired
    private UnconfirmedReportRepository unconfirmedReportRepository;
...
    @FinanceHikariReadTx
    public List<UnconfirmedExcelDownloadView> getExcelData(UnconfirmedSearchCondition condition) {
        List<UnconfirmedExcelDownloadView> excelData = newArrayList();
        excelData.addAll(newArrayList(getPurchaseReportDetailExcel(condition)));
        return excelData;
    }
...
}
@服务
公共类未确认报告服务{
私有静态最终整型预览大小=8;
@自动连线
私有UnconfirmedReportRepository UnconfirmedReportRepository;
...
@FinanceHikariReadTx
公共列表getExcelData(未确认搜索条件){
List excelData=newArrayList();
addAll(newArrayList(getPurchaseReportDetailExcel(条件));
返回数据;
}
...
}
下面的代码调用上述服务

@Slf4j
@Component
public class UnconfirmedDashboardDetailExcelReader extends SellerExcelReaderTemplate<UnconfirmedExcelDownloadView, UnconfirmedSearchCondition> {
    @Autowired
    private UnconfirmedReportService unconfirmedReportservice;

    @Override public List<UnconfirmedExcelDownloadView> read(String conditionJson) {
        UnconfirmedSearchCondition condition = transformCondition(conditionJson);
        List<UnconfirmedExcelDownloadView> viewList = unconfirmedReportservice.getExcelData(condition);
        return viewList;
    }
...
}
@Slf4j
@组成部分
公共类未经确认的DashboardDetailExcelReader扩展SellerExcelReaderTemplate{
@自动连线
私人未确认报告服务未确认报告服务;
@重写公共列表读取(字符串条件JSON){
UnconfirmedSearchCondition=transformCondition(conditionJson);
List viewList=unconfirmedReportservice.getExcelData(条件);
返回视图列表;
}
...
}
如果@MyAnnotation被注释到一个类中,那么将调用procedure(),但是如果一个方法带有类似于上面代码的注释,那么它就不起作用。我希望它只使用方法


我在几个小时内一直在努力解决这个问题,但找不到解决办法。请帮助我。

您目前正在做一些类似于我在中解释的事情,即在类上匹配(元)注释

现在您想知道为什么它与方法不匹配。我解释过了。基本上,
@within()
匹配带注释类中的任何内容,而
@annotation()
匹配带注释的方法。问题是,
@annotation()
需要精确的类型名

但是有另一种方法可以直接在
execution()
签名中表示带注释的方法。在这里,您还可以选择指定元注释,其方式与在注释类中使用元注释的方式类似。让我们比较一下这两者:

package de.scrum\u master.aspect;
导入org.aspectj.lang.JoinPoint;
导入org.aspectj.lang.annotation.Aspect;
导入org.aspectj.lang.annotation.Before;
@面貌
公共类元注释interceptor{
@以前(
“执行(**(..)&&(”+
“在(@de.scrum_master.app.MetaAnnotation*)||内”+
“在(@(@de.scrum_master.app.MetaAnnotation*)*)||”+
“在(@(@(@de.scrum_master.app.MetaAnnotation*)*)内”+
")"
)
公共void AnnotatedClass(JoinPoint thisJoinPoint){
System.out.println(此连接点);
}
@以前(
“执行(@de.scrum_master.app.MetaAnnotation**(..)||”+
“执行(@(@de.scrum_master.app.MetaAnnotation*)**(..)|”+
“执行(@(@(@de.scrum_master.app.MetaAnnotation*)*)**(…)”
)
公共无效注释方法(JoinPoint thisJoinPoint){
System.out.println(此连接点);
}
}
后者就是你要找的。只需将
de.scrum\u master.app.MetaAnnotation
替换为
org.springframework.transaction.annotation.Transactional
,它应该适用于您的用例。确保不要弄乱
()
@
*
的编号和嵌套顺序,否则很快就会出现切入点语法错误


如果您希望使用一个或两个通知方法,您可以创建一个包含两个切入点的大凌乱字符串,或者定义两个独立的
@Pointcut
并将它们组合到通知中,将它们与
|
链接起来,谢谢您的友好回复。它起作用了!!