1 package org.kuali.student.enrollment.class2.courseoffering.controller; 2 3 import org.kuali.rice.krad.web.form.DocumentFormBase; 4 import org.springframework.transaction.annotation.Propagation; 5 import org.springframework.transaction.annotation.Transactional; 6 import org.springframework.validation.BindingResult; 7 import org.springframework.web.servlet.ModelAndView; 8 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 /** 13 * Created with IntelliJ IDEA. 14 * User: Daniel 15 * Date: 7/23/13 16 * Time: 10:54 AM 17 * This method is a round-about way to provide a new transaction when calling MaintenanceDocumentController.route() 18 * 19 * In krad-base-servlet.xml lives this gem: 20 * <aop:config> 21 <aop:pointcut id="controllerTransaction" 22 expression="execution(* org.kuali.rice.krad.web.controller.UifControllerBase+.*(..))"/> 23 <aop:advisor advice-ref="txAdvice" pointcut-ref="controllerTransaction"/> 24 </aop:config> 25 * 26 * Which was proxying all UifControllerBase in a transaction. This is bad if you want to handle exceptions and display 27 * messages to the user without a stacktrace. To get around this, we created this indirect class that can be 28 * transactionally proxied. (Note @Transactional annotation). The propagation is set to requires new, which means that 29 * it will be in a different transaction than the Controller's transaction and any rollbacks will stop at the proxy. 30 * Then in the controller we can catch exceptions without having our initial transaction rolling back. 31 * 32 */ 33 public class ActivityOfferingControllerTransactionHelperImpl implements ActivityOfferingControllerTransactionHelper { 34 35 /* (non-Javadoc) 36 * @see org.kuali.student.enrollment.class2.courseoffering.controller.ActivityOfferingControllerTransactionHelper#routeSuper(org.kuali.rice.krad.web.form.DocumentFormBase, org.springframework.validation.BindingResult, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.kuali.student.enrollment.class2.courseoffering.controller.ActivityOfferingController) 37 */ 38 @Override 39 @Transactional(propagation = Propagation.REQUIRES_NEW) 40 public ModelAndView routeSuper(DocumentFormBase form, BindingResult result, 41 HttpServletRequest request, HttpServletResponse response, ActivityOfferingController activityOfferingController) { 42 return activityOfferingController.routeSuper(form, result, request, response); 43 } 44 45 }