{"id":"1d772c2eb648c07e","repo":"spring-projects/spring-framework","slug":"declareprecedence-not-presently-supported-in-sprin","errorCode":null,"errorMessage":"DeclarePrecedence not presently supported in Spring AOP","messagePattern":"DeclarePrecedence not presently supported in Spring AOP","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AspectMetadata.java","lineNumber":98,"sourceCode":"\t */\n\tpublic AspectMetadata(Class<?> aspectClass, String aspectName) {\n\t\tthis.aspectName = aspectName;\n\n\t\tClass<?> currClass = aspectClass;\n\t\tAjType<?> ajType = null;\n\t\twhile (currClass != Object.class) {\n\t\t\tAjType<?> ajTypeToCheck = AjTypeSystem.getAjType(currClass);\n\t\t\tif (ajTypeToCheck.isAspect()) {\n\t\t\t\tajType = ajTypeToCheck;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcurrClass = currClass.getSuperclass();\n\t\t}\n\t\tif (ajType == null) {\n\t\t\tthrow new IllegalArgumentException(\"Class '\" + aspectClass.getName() + \"' is not an @AspectJ aspect\");\n\t\t}\n\t\tif (ajType.getDeclarePrecedence().length > 0) {\n\t\t\tthrow new IllegalArgumentException(\"DeclarePrecedence not presently supported in Spring AOP\");\n\t\t}\n\t\tthis.aspectClass = ajType.getJavaClass();\n\t\tthis.ajType = ajType;\n\n\t\tswitch (this.ajType.getPerClause().getKind()) {\n\t\t\tcase SINGLETON -> {\n\t\t\t\tthis.perClausePointcut = Pointcut.TRUE;\n\t\t\t}\n\t\t\tcase PERTARGET, PERTHIS -> {\n\t\t\t\tAspectJExpressionPointcut ajexp = new AspectJExpressionPointcut();\n\t\t\t\tajexp.setLocation(aspectClass.getName());\n\t\t\t\tajexp.setExpression(findPerClause(aspectClass));\n\t\t\t\tajexp.setPointcutDeclarationScope(aspectClass);\n\t\t\t\tthis.perClausePointcut = ajexp;\n\t\t\t}\n\t\t\tcase PERTYPEWITHIN -> {\n\t\t\t\t// Works with a type pattern\n\t\t\t\tthis.perClausePointcut = new ComposablePointcut(new TypePatternClassFilter(findPerClause(aspectClass)));","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/spring-projects/spring-framework/blob/e8729d043887bf0d0baf91e062e909b56eb2b708/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AspectMetadata.java#L80-L116","documentation":"Thrown by the AspectMetadata constructor when the resolved AjType declares one or more declare-precedence statements (@DeclarePrecedence). Spring AOP does not implement AspectJ's declare-precedence (ordering across aspects via pointcut patterns); it only supports @Order / Ordered / advice declaration order. This is a deliberate, long-standing limitation.","triggerScenarios":"Processing an aspect class annotated @Aspect with @DeclarePrecedence(\"com.acme.* , com.other.*\") on the type, via any path that builds AspectMetadata (auto-proxy creator, AspectJProxyFactory, BeanFactoryAspectJAdvisorFactory).","commonSituations":"Porting a full AspectJ aspect that uses declare precedence into Spring AOP. Expecting cross-aspect pattern-based ordering to work under @EnableAspectJAutoProxy.","solutions":["Remove the @DeclarePrecedence annotation from the aspect type.","Express ordering using @Order on each aspect class, implementing Ordered, or ordering advice via declaration order within a single aspect.","If declare-precedence semantics are essential, use AspectJ compile-time or load-time weaving."],"exampleFix":"// before\n@Aspect\n@DeclarePrecedence(\"com.acme.SecurityAspect, com.acme.LoggingAspect\")\npublic class OrderingAspect { ... }\n// after\n@Aspect\n@Order(1)\npublic class SecurityAspect { ... }\n\n@Aspect\n@Order(2)\npublic class LoggingAspect { ... }","handlingStrategy":"validation","validationCode":"import org.aspectj.lang.reflect.AjTypeSystem;\n\nvoid ensureNoDeclarePrecedence(Class<?> aspectClass) {\n  if (AjTypeSystem.getAjType(aspectClass).getDeclarePrecedence().length > 0)\n    throw new IllegalStateException(aspectClass + \" uses @DeclarePrecedence, unsupported by Spring AOP\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use @Order / Ordered for cross-aspect ordering in Spring AOP; never @DeclarePrecedence.","Reserve declare-precedence for AspectJ-woven modules."],"tags":["spring-aop","aspectj","declare-precedence","ordering","configuration"],"analyzedSha":"e8729d043887bf0d0baf91e062e909b56eb2b708","analyzedAt":"2026-08-04T19:07:39.725Z","schemaVersion":2}