我正在使用Spring 3.1并编写了DAO和服务层(事务性)。
但是在特殊情况下,为了避免延迟初始化异常,我必须创建一个spring mvc请求处理程序方法@transactional。但它没有将事务附加到该方法。方法名称是ModelAndView home(HttpServletRequest请求,HttpServletResponse响应)。 http://forum.springsource.org/showthread.php?46814-Transaction-in-MVC-Controller 从这个链接看来,无法将事务(默认情况下)附加到mvc方法。该链接中建议的解决方案似乎适用于Spring 2.5(覆盖handleRequest)。任何帮助都会得到真正的认可。感谢
@Controller
public class AuthenticationController {
@Autowired
CategoryService categoryService;
@Autowired
BrandService brandService;
@Autowired
ItemService itemService;
@RequestMapping(value="/login.html",method=RequestMethod.GET)
ModelAndView login(){
return new ModelAndView("login.jsp");
}
@RequestMapping(value="/home.html",method=RequestMethod.GET)
@Transactional
ModelAndView home(HttpServletRequest request, HttpServletResponse response){
List<Category> categories = categoryService.readAll();
request.setAttribute("categories", categories);
List<Brand> brands = brandService.readAll();
request.setAttribute("brands", brands);
List<Item> items = itemService.readAll();
request.setAttribute("items", items);
Set<Image> images = items.get(0).getImages();
for(Image i : images ) {
System.out.println(i.getUrl());
}
return new ModelAndView("home.jsp");
}
答案 0 :(得分:4)
您需要实现一个接口,以便Spring可以将其用作代理接口:
@Controller
public interface AuthenticationController {
ModelAndView home(HttpServletRequest request, HttpServletResponse response);
}
@Controller
public class AuthenticationControllerImpl implements AuthenticationController {
@RequestMapping(value="/home.html",method=RequestMethod.GET)
@Transactional
@Override
ModelAndView home(HttpServletRequest request, HttpServletResponse response){
.....
}
}
答案 1 :(得分:4)
Spring将使用JDK动态代理实现事务逻辑,这些代理依赖于实现合适接口的代理类。也可以使用不需要接口的CGLib代理。
关于这个link
,有一篇很好的文章答案 2 :(得分:0)
我不确定这是否适用于您的情况,但如果您使用单独的 DI 上下文,您还应该考虑 Spring 如何编织方面。
Spring 只会将 @Transactional
语义应用于使用 @EnableTransactionManagement
或 <tx:annotation-driven/>
的同一 DI 上下文中的 bean。
因此,如果您在根上下文中定义事务配置,则仅涵盖该上下文中的 bean,这通常意味着仅业务服务。
您需要在还使用 @Transactional
的任何子上下文中重新启用事务管理。
参考: Spring AOP - How to make aspects defined in a parent context work in child contexts?