[jboss-user] [JBoss AOP] New message: "Problem with AOP arond advice in JBoss trunk"

Andrew Dinn do-not-reply at jboss.com
Tue Jan 26 07:19:54 EST 2010


User development,

A new message was posted in the thread "Problem with AOP arond advice in JBoss trunk":

http://community.jboss.org/message/522280#522280

Author  : Andrew Dinn
Profile : http://community.jboss.org/people/adinn

Message:
--------------------------------------------------------------
I have been trying to revive on AS trunk the Web Service Transactions BAFramework demo which we last had working on AS 4.2.3. In doing so  have come across what appears to be a problem with AOP. I don't have a _simple_ test case yet but by playing around with the code I have pinned the problem down.
 
My AOP advice binding is not being applied in a specific circumstance. This happens when the method belongs to an EJB and is annotated with a WebMethod annotation. In this case if I annotate the method with the BAMethod annotation AOP fails to apply the advice binding it. However, if I move the BAMethod annotation to a submethod called by the WebMethod then AOP respects the binding. Here, in brief, are the details of the failing and working cases:
 
This is the jboss-aop.xml
 
<aop xmlns="urn:jboss:aop-beans:1.0">
 
    <!-- BA Processing Aspect -->
    <aspect class="org.jboss.jbossts.baframework.aspect.TransactionProcessingAspect" scope="PER_INSTANCE"/>
 
    <pointcut name="baMethodAnnotation" expr="execution(* *->@org.jboss.jbossts.baframework.annotation.BAMethod(..))"/>
 
    <pointcut name="baDataManagementAnnotation" expr="field(org.jboss.jbossts.baframework.datamgmt.DataManager *->@org.jboss.jbossts.baframework.annotation.BADataManagement)"/>
 
    <bind pointcut="baMethodAnnotation">
        <advice name="process" aspect="org.jboss.jbossts.baframework.aspect.TransactionProcessingAspect"/>
    </bind>
 
    <bind pointcut="baDataManagementAnnotation">
        <advice name="access" aspect="org.jboss.jbossts.baframework.aspect.TransactionProcessingAspect"/>
    </bind>
</aop>
 
n.b. teh aspect class, TransactionProcessingAspect, implements methdos with the following signatures:
 
    public Object process(MethodInvocation invocation) throws Throwable;
    public Object access(FieldReadInvocation invocation) throws Throwable;
    public Object access(FieldWriteInvocation invocation) throws Throwable;
 
Here is the web service implementation class te aspect should be applied to
 
@Stateless
@Remote(Hotel.class)
@WebService(name="Hotel")
@SOAPBinding(style = SOAPBinding.Style.RPC)
@HandlerChain(file = "jaxws-handlers-server.xml")
@BAService(serviceClass=HotelImpl.class,ejbInterface=Hotel.class,jndiName="bademo/HotelImpl/remote")
public class HotelImpl implements Hotel
{
    . . .
    @WebMethod
    @BAMethod(agreement=AgreementType.PARTICIPANT_COMPLETION)
    @BACompensatedBy(value="cancelRoom",type=DataMatch.CUSTOM)
    @BAResult("reservationNumber")
    public Integer bookRoom(@BAParam("username")String username, at BAParam("password")String password, Integer roomNumber)
            throws HotelCustomException, RoomAlreadyOccupiedException
    {
        log.info("bookRoom()");
        hotelView.newMethod("bookRoom()");
        hotelView.addMessage("Username: " + username);
    . . .
 
This version of the code builds and boots up ok but AOP fails to call the aspect class's advice method, process(MethodInvocation invocation)
 
However, if I introduce an auxiliary method so that the web service target method becomes a wrapper and then split the annotations, applying the @WebMethod to the wrapper and the @BAMethod annotation to the auxiliary method, then my advice method does get called.
 
    @WebMethod
    public Integer bookRoom(String username, String password, Integer roomNumber)
            throws HotelCustomException, RoomAlreadyOccupiedException
    {
        return bookRoomInternal(username, password, roomNumber);
    }
 
    @BAMethod(agreement=AgreementType.PARTICIPANT_COMPLETION)
    @BACompensatedBy(value="cancelRoom",type=DataMatch.CUSTOM)
    @BAResult("reservationNumber")
    public Integer bookRoomInternal(@BAParam("username")String username, at BAParam("password")String password, Integer roomNumber)
            throws HotelCustomException, RoomAlreadyOccupiedException
    {
        log.info("bookRoom()");
        hotelView.newMethod("bookRoom()");
        hotelView.addMessage("Username: " + username);
    . . .
 
Any idea why AOP does not call process when both annotations  are applied tot he service method?
 
If you need the full source I can provide it but it's a bit large and messy as it involves EJB, Web Servces and XTS (BA) code as well as the aspect code sketched above. I was hoping this description might be enough to allow you to identify what is wrong.
 
n.b. I am doing the AOP transform offline but I encountered the same failure using dynamic AOP. I have not yet seen whether inserting the auxiliary method fixes the dynamic AOP case.
 
regards,
 

Andrew Dinn

--------------------------------------------------------------

To reply to this message visit the message page: http://community.jboss.org/message/522280#522280




More information about the jboss-user mailing list