5

我正在使用 Spring 3.1 并编写了我的 DAO 和服务层(事务)。

但是在特殊情况下,为了避免惰性初始化异常,我必须创建一个 spring mvc 请求处理程序方法@transactional。但它未能将事务附加到该方法。方法名称是 ModelAndView home(HttpServletRequest request, HttpServletResponse response)。 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");    
}
4

3 回答 3

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){
.....
}
}
于 2012-10-19T10:05:27.433 回答
4

Spring 将使用 JDK 动态代理来实现事务逻辑,这些代理依赖于实现合适接口的代理类。也可以使用不需要接口的 CGLib 代理。

有一篇关于这个链接的好文章

于 2012-10-19T10:36:57.260 回答
0

我不确定这是否适用于您的情况,但如果您使用单独的 DI 上下文,您还应该考虑 Spring 如何编织方面。

Spring 只会将语义应用于使用or@Transactional的相同 DI 上下文中的 bean 。@EnableTransactionManagement<tx:annotation-driven/>

因此,如果您在根上下文中定义事务配置,则仅涵盖该上下文中的 bean,这通常意味着仅业务服务。您需要在您还使用@Transactional.

参考: Spring AOP - 如何使父上下文中定义的方面在子上下文中工作?

于 2021-05-17T15:15:50.940 回答