Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使Spring3MVC控制器方法事务化_Java_Spring_Hibernate_Jakarta Ee_Spring Mvc - Fatal编程技术网

Java 使Spring3MVC控制器方法事务化

Java 使Spring3MVC控制器方法事务化,java,spring,hibernate,jakarta-ee,spring-mvc,Java,Spring,Hibernate,Jakarta Ee,Spring Mvc,我正在使用Spring3.1,并编写了DAO和服务层(事务性) 然而,在一种特殊情况下,为了避免惰性init异常,我必须创建一个springmvc请求处理程序方法@transactional。但它未能将事务附加到该方法。方法名为ModelAndView home(HttpServletRequest请求,HttpServletResponse响应)。 从这个链接来看,似乎不可能将事务(默认情况下)附加到mvc方法。该链接中建议的解决方案似乎适用于Spring2.5(覆盖HandlerReques

我正在使用Spring3.1,并编写了DAO和服务层(事务性)

然而,在一种特殊情况下,为了避免惰性init异常,我必须创建一个springmvc请求处理程序方法@transactional。但它未能将事务附加到该方法。方法名为ModelAndView home(HttpServletRequest请求,HttpServletResponse响应)。 从这个链接来看,似乎不可能将事务(默认情况下)附加到mvc方法。该链接中建议的解决方案似乎适用于Spring2.5(覆盖HandlerRequest)。任何帮助都将受到感激。谢谢

@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");    
}
@控制器
公共类AuthenticationController{
@自动连线
类别服务类别服务;
@自动连线
品牌服务品牌服务;
@自动连线
项目服务项目服务;
@RequestMapping(value=“/login.html”,method=RequestMethod.GET)
ModelAndView登录名(){
返回新的ModelAndView(“login.jsp”);
}   
@RequestMapping(value=“/home.html”,method=RequestMethod.GET)
@交易的
ModelAndView主页(HttpServletRequest请求、HttpServletResponse响应){
List categories=categoryService.readAll();
request.setAttribute(“类别”,categories);
List brands=brandService.readAll();
request.setAttribute(“品牌”,品牌);
List items=itemService.readAll();
request.setAttribute(“items”,items);
设置images=items.get(0.getImages();
用于(图像i:图像){
System.out.println(i.getUrl());
}
返回新的ModelAndView(“home.jsp”);
}

您需要实现一个接口,这样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){
.....
}
}

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


关于这个

< P>有一篇很好的文章,我不确定这是否适用于你的情况,但是如果你使用单独的DI上下文,你也应该考虑Spring如何编织方面。

Spring将只在使用
@EnableTransactionManagement
的同一DI上下文中对bean应用
@Transactional
语义

因此,如果您在根上下文中定义事务配置,则只会覆盖该上下文中的bean,这通常意味着只包含业务服务。 您需要在同时使用
@Transactional
的任何子上下文中重新启用事务管理

参考:

您试图回滚什么?在您定义@Transaction注释的控制器函数上,没有可以回滚的此类数据库操作。我感到困惑。所有服务调用,如categoryService.readAll()是数据库操作吗?但是您不能回滚读取的数据。您到底想回滚什么?在事务中包装home方法仍然很有用,因为它可能有助于共享数据库连接。是的,连接将被共享,而且延迟加载只在同一个会话中工作。我认为这是更好的方法答:如果您不指定接口,Spring将尝试为控制器创建cglib代理,并且只要cglib在类路径上,这一切都可以正常工作,您不需要处理任何更改。我遇到了@requestmapping问题,试图让具有接口的控制器工作此链接已更改为。我们使用springBoot 1.2.3.RELEASE和spring 4.1.6.RELEASE时,我遇到了完全相反的情况:如果控制器(@RequestMapping)正式实现了一个接口,spring将创建一个JdkDynamicAopProxy(它启动时没有错误,但dispatcher servlet在运行时找不到URL映射的入口点)。如果控制器没有正式实现接口,则会生成CglibAopProxy,并且一切工作正常。CGLib不需要是显式依赖项,这与下面chrismarx的注释相反。