Ok, so I have worked with Micha to resolve this and it looks like this issue is taken care of. I can now successfully advise my beans such as service layers, etc.
So, AOP now works on Railo with Transfer when doing this. My issue (which has been the issue all along) is still that I can't advise an entire handler method in ColdBox. My scenario is that I have multiple service layer calls inside my handler and I want the ENTIRE handler method wrapped in a transaction so in case any of the service layer calls fail they will all be rolled back. I have applied the advice using this: <cfset instance.TransferTransaction.advise(this,"createUser", true)> In my onDIComplete method of the handler and I see the trace that advice has been weaved for createUser, but the transaction simply doesn't work. When I run multiple Transfer actions where one of them is set up to fail, the others that were called first are not rolled back, even though they are all wrapped in the advice since they are all in the handler method and the method has been advised. Like I said, I see the trace that the advice has been applied to the method, but for whatever reason it doesn't do anything. I have also tried using this: <cfset transaction.execute(this, "createUser", arguments)> Inside of a proxy method on my handler (doCreateUser). So, when I call doCreateUser() it executes createUser fine, I see database inserts and it works. However, if one of the inserts inside createUser() is set up to fail (I call it with bad data from a form, string where it should be a number), the others are not rolled back even though the entire method was called using the execute method of the transaction. So, my issue is that I need to be able to advise an entire handler method in ColdBox with Transfer, but when I try this with multiple methods, it doesn't causes any errors, but it doesn't actually advise the method with a transaction. On Jul 2, 1:22 am, Mark Mandel <mark.man...@gmail.com> wrote: > aha, there you go! :) > > Mark > > On Thu, Jul 2, 2009 at 6:13 PM, whostheJBoss > <dotfus...@changethings.org>wrote: > > > > > > > From Micha: > > > "this was a failure (only in version 3.1.0.015 to 3.1.019) we have > > already fixed, please update to newest release 3.1.0.020 on > > dev.railo.ch > > or wait for release coming today/tomorrow on www. " > > > Go figure! > > > On Jul 2, 12:53 am, whostheJBoss <dotfus...@changethings.org> wrote: > > > I was just coming here to update this thread... > > > > I posted this to Railo's group: > > > >http://groups.google.com/group/railo/browse_thread/thread/a34c465edcd... > > > > It seems that Railo is failing to rollback, not Transfer. > > > > On Jul 2, 12:38 am, Mark Mandel <mark.man...@gmail.com> wrote: > > > > > Does Railo not rollback transactions when an error is thrown from the > > code? > > > > > Mark > > > > > On Thu, Jul 2, 2009 at 5:35 PM, whostheJBoss < > > dotfus...@changethings.org>wrote: > > > > > > Ok, I am seeing the advice work properly now. I have been testing > > > > > vigorously on both CF8 and Railo 3.1.017 > > > > > > Here is what I have discovered: > > > > > > Transaction advise on Railo traces this: > > > > > > Weaving Transaction advice on model.users.userservice::saveusers() > > > > > > So it does fire the AOPAdvisor and modifies the method. > > > > > > I can run my saveusers() method over and over, no problems, no stack > > > > > overflow. > > > > > > Now, in the middle of doing this I wanted to test if transactions > > were > > > > > actually working (if the database would rollback my insert upon > > > > > failure of something happening inside the advised method), so I did > > > > > the following: > > > > > > I created two user objects which I pass into userService.saveusers() > > > > > from my handler with: > > > > > > getBean("userService").saveusers(user1,user2); > > > > > > The method looks like this: > > > > > > <cffunction name="saveusers" access="public" output="false" > > > > > returntype="void"> > > > > > <cfargument name="user1" type="any" required="true" /> > > > > > <cfargument name="user2" type="any" required="true" /> > > > > > > <cfset variables.transfer.save(arguments.user1) /> > > > > > <cfset variables.transfer.save(arguments.user2) /> > > > > > </cffunction> > > > > > > I run this once and see that both are inserted properly. > > > > > > Now, I want the next transaction to fail for my test, but only after > > > > > user1 has been inserted, so I need it to fail on user2. This way, > > > > > since save(arguments.user1) will add a record to the database and is > > > > > inside the same advised transaction as save(arguments.user2), then > > > > > when user2 fails the insert of user1 should be rolled back as well > > > > > since they are in the same transaction and neither should show up in > > > > > the database. > > > > > > So, what I did was have user1.setPassword("test"); and > > > > > user2.setPassword("testtest"); > > > > > > My database field for password is VARCHAR(8) so both are valid the > > > > > first time I try to insert. So, after I do the first insert and both > > > > > user1 and user2 work properly and are inserted, I then modified my > > > > > database to be VARCHAR(4) for password. So now the next time I call > > > > > saveusers() the save(arguments.user1) should work and save > > > > > (arguments.user2) should fail since its password field is too long. > > > > > > Both saves are advised in userService.saveUser() inside the save > > > > > transaction, so neither should show up when user2 fails. > > > > > > So, when I do this it does fail and say that the password field for > > > > > user2 is too long, but the insert of user1 stays in the database. > > > > > > So, again, when both users are valid objects, they both get inserted. > > > > > When one of the users contains data that is too long for the database > > > > > field (both after modifying the field or if I try to insert with > > > > > incorrect data initially) then the first user is inserted and stays > > in > > > > > the database when it should be rolled back while the second fails. > > > > > > On ColdFusion 8 the transaction advise works and user1 is rolled back > > > > > and doesn't show up in the database when I use the exact same code. > > > > > > I see on Railo the trace that userService.saveusers() has been > > > > > advised, but the transaction just doesn't roll back. > > > > > > Any idea what the caveat with this on Railo is? This is the only > > thing > > > > > I believe that isn't working on Railo. > > > > > > On Jul 1, 6:52 pm, Mark Mandel <mark.man...@gmail.com> wrote: > > > > > > On Thu, Jul 2, 2009 at 10:43 AM, whostheJBoss < > > > > > dotfus...@changethings.org>wrote: > > > > > > > > Yes, I did that example exactly before, that's what this is based > > on. > > > > > > > > So the trace I see that says "weaving advice" the first time, > > that > > > > > > > just means it's modifying the method? Even though I don't see > > that > > > > > > > trace the next time, the advice is still there? > > > > > > > Yes. The AOP works by replacing the method inside the CFC with > > another > > > > > one, > > > > > > and then calling the original which it has moved. > > > > > > > What platform are you on? > > > > > > > Mark > > > > > > > -- > > > > > > E: mark.man...@gmail.com > > > > > > T:http://www.twitter.com/neurotic > > > > > > W:www.compoundtheory.com > > > > > -- > > > > E: mark.man...@gmail.com > > > > T:http://www.twitter.com/neurotic > > > > W:www.compoundtheory.com > > -- > E: mark.man...@gmail.com > T:http://www.twitter.com/neurotic > W:www.compoundtheory.com --~--~---------~--~----~------------~-------~--~----~ Before posting questions to the group please read: http://groups.google.com/group/transfer-dev/web/how-to-ask-support-questions-on-transfer You received this message because you are subscribed to the Google Groups "transfer-dev" group. To post to this group, send email to transfer-dev@googlegroups.com To unsubscribe from this group, send email to transfer-dev-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/transfer-dev?hl=en -~----------~----~----~----~------~----~------~--~---