[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] Passing a parameter created in the advice to the pointcut implementation
|
Hi Alexander,
sorry for the last two poor formatted reply mails. My Android mail
client led to that problem. Hopefully now you get readable content -
especially for the example code you requested to get a better
understanding of the AOP problem I have. I'm really interested in a
solution - maybe based on your suggestions regarding:
- Inter-type definitions (even possible in Spring aspects via so-called
“Introductions” when using “declare-parents”)
- Aspects instantiated per “this” or “target”
Would be kind to check whether this is really possible here. I’m really
looking forward to reading from you again :-)
Here comes my Spring AspectJ annotated aspect:
/* AOP aspect running on all methods being called on objects of type
"IdmAdaptor" */
package com.xxxxx.fs.idm.ws.aop;
@Aspect
public class FSConnectionAspect {
/* match all methods located in classes implementing interface
“IdmAdaptor” and limited to Spring bean“fsIdmAdaptor” */
@Pointcut("execution(within(com.xxxxx.fs.idm.ws.IdmAdaptor+) and
bean(fsIdmAdaptor)")
public void operations() {
}
@Around("operations")
public Object handleConnection(ProceedingJoinPointjoinpoint) {
Object retVal = null;
try {
Connection conn = ConnectionManager.getConnection(<host>,
<port>, <mode>,<user>, <password>);
try {
conn.connect();
Object[] args = joinpoint.getArgs();
/* how to pass and access the connection object to the
pointcut implementation without changing the
interface method
signature there? Here in the example the signature is
"public boolean enableAccount(EnableAccountType
parameters)", see below! */
Object result = joinpoint.proceed(args);
} catch (IOException e) {
} catch (AuthenticationException e) {
} catch(MaximumNumberOfSessionsExceededException e) {
} finally {
if (conn.isConnected()) {
try {
conn.close();
} catch (IOException e) {
}
}
}
} catch (Throwable e) {
}
return retVal;
}
}
Here comes my Spring bean implementing the “IdmAdaptor” interface where
the pointcut defined in the aspect works with. It has to use the
connection object administrated within the aspect. The question: how to
do that?
package com.xxxxx.fs.idm.ws.impl;
public class FSIdmAdaptor implements IdmAdaptor,
ApplicationContextAware {
...
@Override
public boolean enableAccount(EnableAccountTypeparameters)
throws IdmFaultMessage {
boolean retVal = false;
...
//here the connection object is used created and managed in the
Spring AspectJ aspect
AdminService adminService =conn.getService(AdminService.class)
...
return retVal;
}
...
@Override
public void setApplicationContext(ApplicationContextapplicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
}
Am 18. Februar 2015 23:34:44 MEZ, schrieb Alexander Kriegisch
<alexander@xxxxxxxxxxxxxx>:
I forgot to mention: An alternative approach might be aspects instantiated perthis or pertarget, keeping state for your objects if you want to avoid ITD.
Hi Holger. Some more or less extensive code snippets would be
helpful, but as far as I understand you want to inject a value
into certain objects. Unless there is some kind of "value store"
such as a map of key/value pairs or so in your object, you can
use ITD (inter-type definition) in order to add members to the
desired types. If you provide some sample code - ideally a fully
functional SSCCE (http://sscce.org/) - I am sure someone will
suggest an aspect which will show you how to do that based on
your code. Concrete examples are usually more helpful than
abstract ones. Tit for tat, code for code - deal? ;-) Regards --
Alexander Kriegisch http://scrum-master.de Holger King schrieb
am 18.02.2015 23:04:
I just moved a cross-cutting-concern (the creation and
closing of a non-JDBC-connection) from a web service to a
Spring AOP AspectJ implementation. This aspect is being
called each time any method of the web service interface is
requested. The problem: the pointcut (= web service
implementation) needs the connection being created in the
advice! But as the method signatures are defined by the web
service contract (the WSDL document has been converted to
Java classes via "wsdl2java" based on the contract first
approach) they cannot be adapted and modified to take over
the new connection parameter. It's clear that the other way
around where the AspectJ advice gets the parameter used in
the method call matching the pointcut defintion is possible.
Even changing existing parameter values and passing the same
arguments list (having the same types) to the implementation
where the pointcut matches does work (using "&& args()" in
the pointcut in combination with
joinpoint.proceed(jointpoint.getArgs())) But here the
problem exists, as it's not sufficient to just change
parameter values. Instead, a complete new variable owning
the connection created in the advice needs to be accessible
in the objects the pointcut matches. Do you have any idea
how to realize that? Or is it a complete wrong approach to
do that using Java aspects - although connection handling
might be a typical cross-cutting-concern?
------------------------------------------------------------------------
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.eclipse.org/mailman/listinfo/aspectj-users