Hello, We got the following excpetion AbstractMethodError when we used mixin on interfaces. The exception does not occur when we applied the same aspect on implementation - See below the aspect.
We would like to know what we're doing wrong when we use interfaces? The behavior is a logging aspect. We want to logging all methods from the interfaces, especially the find* methods. I've put >>>> 45 et >>>> 34 to give you the line number where the error is triggered inside the code. By the past, in "coded-style", with "declare parents", applying aspect on interfaces did not raise an error. Best regards ============= ERROR TRACE ============= java.lang.AbstractMethodError: com/cpny/crm/aspects/LoggingBaseBehavior$Loggable.getLog()Lorg/slf4j/Logger; at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke( MethodBindingMethodExpressionAdapter.java:102) at com.sun.faces.application.ActionListenerImpl.processAction( ActionListenerImpl.java:102) ... 39 more Caused by: java.lang.AbstractMethodError: com/intact/cpny/aspects/LoggingBaseBehavior$Loggable.getLog()Lorg/slf4j/Logger; at com.cpny.crm.aspects.LoggingServiceBehavior.loggerService( LoggingServiceBehavior.java:45) at com.cpny.crm.domain.services.impl.EDocService.findDocumentsByPolicy( EDocService.java:34) ========================================== ASPECT (LoggingServiceBehavior) ========================================== import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.DeclareMixin; import org.aspectj.lang.annotation.Pointcut; @Aspect public class LoggingServiceBehavior extends LoggingBaseBehavior { @DeclareMixin("com.cpny.crm.domain.services.interfaces.*") public static Loggable createLoggerDelegate(Object o) { return new ServantLogger(o.getClass()); } @Pointcut("execution(* com.cpny.crm.domain.services.interfaces.*.find*(..))") public void serviceLogger() {}; @Before(value = "serviceLogger() && this(log)") public void loggerService(JoinPoint jp, JoinPoint.StaticPart jps, Loggable log) { >>>> 45 if (log.getLog().isDebugEnabled()) { final String args = buildParameters(jp.getArgs()); log.getLog().debug(jps.getSignature().getName() + " - Entering..." + (args.isEmpty() ? "" : " - params: " + args)); } } } =================== ASPECT BASE ================== import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Aspect public abstract class LoggingBaseBehavior { protected String buildParameters(Object[] parameters) { StringBuilder sb = new StringBuilder(64); if (parameters == null) return null; for(int i = 0; i< parameters.length; i++) { sb.append("Param") .append(i+1) .append(" : ") .append("'") .append(parameters[i]) .append("'"); if (i+1 < parameters.length) { sb.append(" - "); } } return sb.toString(); } /* * The interface and the implementation of Loggable class. */ public interface Loggable { public Logger getLog(); }; public static class ServantLogger implements Loggable { private transient Logger log = null; public ServantLogger(Class<? extends Object> clazz) { this.log = LoggerFactory.getLogger(clazz); } @Override public Logger getLog() { return log; } } } ================================= THE SERVICE INTERFACES ================================= public interface IEDocService extends Serializable { public IEdocTree findDocumentsByPolicy(String policyNumber, Date inceptionDate, List<IAgreement> clientAgreementList, UserBean user); } ============================================================== THE SERVICE IMPLEMENTATION - EDocService.java ============================================================== @Named @Scope("singleton") public class EDocService implements IEDocService { private static final long serialVersionUID = 1101L; private final String SSDC_APPLICATION_CRM_ID = "EDOC"; @Override public IEdocTree findDocumentsByPolicy(String policyNumber , Date inceptionDate , List<IAgreement> clientAgreementList , UserBean user) { >>>> 34 IEdocTree eDocTree = null; final Map<String, ElectronicDocumentByPolicy> eDocPolicies = new HashMap<String,ElectronicDocumentByPolicy>(); final Map<String, IEdocTree> eDocTreeCurrent = new HashMap<String, IEdocTree>(); final Map<String, IEdocTree> eDocTreeHistory = new HashMap<String, IEdocTree>(); final Map<String, DescriptionRuleHistory> eDocDescriptions = new HashMap<String, DescriptionRuleHistory>(); final Map<String,Object> alreadySeenEDocs = new HashMap<String,Object>(); IDocumentPresentationService eDocService = DocumentPresentationFactory. getDocumentPresentationService(); eDocTree = eDocService.getEdocTreeHistory( eDocPolicies , eDocTreeCurrent , eDocTreeHistory , eDocDescriptions , alreadySeenEDocs , policyNumber , inceptionDate , user.getBusinessUnit().getProvince() , user.getLocale().getLanguage() , buildTerm(clientAgreementList) , false , user.getIvUser() , user.getUserType() , SSDC_APPLICATION_CRM_ID , user.getBusinessUnit().getManufacturerCompany() , user.getBusinessUnit().getDistributionChannel() , user.getBusinessUnit().getInsuranceBusiness()); return eDocTree; } }
_______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/aspectj-users