`
com0606
  • 浏览: 60955 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

springmvc的controller中使用@Transactional无效

 
阅读更多

最近看mybatis的时候做了一个练习,但是进行事务处理的时候出了问题,如下

package com.henu.lz.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.henu.lz.dao.PersonMapper;
import com.henu.lz.model.Person;

@Controller
public class SupplierController {
	
	@Autowired
	PersonMapper personMapper;
	
	@Transactional
	@RequestMapping("/add")
	public String addPerson(
			@RequestParam("name1") String name1,
			@RequestParam("age1") int age1,
			@RequestParam("name2") String name2, 
			@RequestParam("age2") int age2, 
			Model model) {
		
		Person person1 = new Person();
		Person person2 = new Person();
		person1.setName(name1);
		person1.setAge(age1);
		person2.setName(name2);
		person2.setAge(age2);
		
		personMapper.save(person1);
		personMapper.save(person2);
		
		model.addAttribute("message", "添加成功!");
		return "success";
	}
}

 spring容器和springmvc的配置都没有问题,dao层就是mybatis比较与众不同的的写有sql的xml以及接口。在从前台传值的时候person1正常传,person2传能抛SQLException的值,按理说事务应该回滚的,数据库中不会有person1,但是查看数据库却有person1。用的mysql,引擎设置为innodb后还是这样,换了oracle之后依然如此。这两次save不在一个事务。

网上看了下别人的经历,有的是try…catch之后自行处理没有throw,有的是说设置rollbackFor……有一个比较接近

http://www.iteye.com/topic/714686

用的是 hibernate 3.2在配置dao和controller的时候都用了注解方式自动扫描

<context:component-scan base-package="com..." />

 这样说是导致dao中事务无效,我试过这样配置,服务启动直接就出错了,很显然冲突,而且用context:include-filtercontext:exclude-filter来屏蔽掉controller层的解决办法也有点没必要,分别扫描dao层和controller层不就行了,我是这样配置的。

查看mybatis官网上的project,是比我多了一层service层,然后在service中用的@transactional,我加了一层

package com.henu.lz.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.henu.lz.dao.PersonMapper;
import com.henu.lz.model.Person;

@Service(value="personService")
public class PersonServiceImpl implements PersonService {
	
	@Autowired
	private PersonMapper personMapper;
	
	@Transactional
	public void save(Person p1, Person p2) {
		personMapper.save(p1);
		personMapper.save(p2);
	}

}

 相应的,controller也修改为

package com.henu.lz.controller;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.henu.lz.model.Person;
import com.henu.lz.service.PersonService;

@Controller
public class SupplierController {
	
	@Resource
	private PersonService personService;
	
	@RequestMapping("/add")
	public String addPerson(
			@RequestParam("name1") String name1,
			@RequestParam("age1") int age1,
			@RequestParam("name2") String name2, 
			@RequestParam("age2") int age2, 
			Model model) {
		
		Person person1 = new Person();
		Person person2 = new Person();
		person1.setName(name1);
		person1.setAge(age1);
		person2.setName(name2);
		person2.setAge(age2);

		personService.save(person1, person2);
		
		model.addAttribute("message", "添加成功!");
		return "success";
	}
}

 这时再按开始那样传值能得到预期结果了。

一开始也注意到少了一层service,但是觉得在controller中做同样的事情也可以的,所以就杯具了。

 

因为spring的context和mvc是分开的,貌似controller不能被注册到spring的context中,于是不能被transactionManager拦截,那么controller中那个@transactional就不起作用了。看了声明式事务的五种配置,都是对注册到context中的bean起作用的,不论是拦截器方式还是aop:config方式。

事务注解方式不能应用于接口,我的mapper用的又是xml方式的,所以只能加一层service,然后controller中的交易就放在service层。

 

不知道大家有木有遇到过类似现象,有好的建议希望不吝赐教啊

 

分享到:
评论
2 楼 com0606 2013-01-17  
jerrynbcl 写道
我也是碰到这问题,在控制层加事务的注解没有生效,如果不加service层难道没有办法实现吗?我是在控制层调用了两个dao的保存方法。能不能在控制层手动开启事务?求解答。

最好在service层写有多个数据库操作的处理,controller层就是业务逻辑处理的,别在那里面进行事务处理,当然,手动获取开启关闭事务也可以。
1 楼 jerrynbcl 2013-01-14  
我也是碰到这问题,在控制层加事务的注解没有生效,如果不加service层难道没有办法实现吗?我是在控制层调用了两个dao的保存方法。能不能在控制层手动开启事务?求解答。

相关推荐

    SpringMVC controller

    在SpringMVC中,用户请求的数据通常会被封装在Model中,并通过Controller返回给视图(View),最后展示给用户。而视图的作用就是将模型数据以合适的方式展示给用户。 在创建基于SpringMVC的Web应用程序时,需要在...

    Java后台服务器Maven+SpringMVC+Ajax+@RequestBody+Json传输

    SpringMVC提供了一系列的注解,如`@Controller`、`@RequestMapping`等,让开发者可以更方便地编写控制器,处理HTTP请求。 `Ajax`(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下,通过...

    SpringMVC中一个Controller多个方法

    在Spring MVC中,Controller类通常使用@Controller注解标识,并且可以包含多个处理请求的方法,这些方法通过@RequestMapping或其变体进行映射。 例如,假设我们有一个名为`UserController`的Controller类,我们可以...

    springmvc事务配置到controller.zip

    @Controller public class UserController { @Autowired private UserService userService; @Transactional public void createUser(User user) { userService.saveUser(user); userService....

    springmvc_controller_01

    2. **注解驱动的 Controller**:Spring MVC 使用注解来简化配置,如 `@RestController` 和 `@Controller`。`@RestController` 适用于 RESTful 风格的应用,它结合了 `@Controller` 和 `@ResponseBody`,意味着返回值...

    java-mybatis、springmvc 整合demo源码(druid-demo)

    2. 确保@Transactional注解的使用位置正确,它只能在受Spring管理的bean(如@Controller、@Service、@Repository)的方法上生效。 3. 检查事务的传播行为,默认是REQUIRED,可能需要根据业务需求调整。 4. 注意@...

    详解SpringMVC Controller介绍及常用注解

    在 SpringMVC 中,提供了一个非常简便的定义 Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用 @Controller 标记一个类是 Controller,然后使用 @RequestMapping 和 @RequestParam 等一些注解用以...

    springMVC基本配置(Controller+Service+Dao)

    在SpringMVC中,我们使用`@Controller`注解来标识一个类作为控制器。例如,你可以创建一个名为`HelloController`的类,并添加`@RequestMapping`注解来处理特定的URL请求。如下所示: ```java @Controller public...

    解决SpringMVC Controller 接收页面传递的中文参数出现乱码的问题

    但是,在使用SpringMVC时,常见的一个问题是Controller 接收页面传递的中文参数出现乱码。这种情况下,Controller 无法正确地接收和处理中文参数,导致程序出现错误。那么,如何解决这个问题呢? 解决方法: ...

    如何在springMVC的controller中获取request

    然后,在 TestController 中,我们继承了 BaseController 超类,可以直接使用 request 和 response 对象。 在 SpringMVC 中获取 Request 对象有多种方法,但这两种方法是最常用的。无论是使用 RequestContextHolder...

    springMVC技术概述

    常用注解:@Controller @RestController(Controller+ResponseBody) @Service @Transactional @Mapper @AutoWired @RequestMapping--路由 @RequestParam--参数绑定(不同名参数或Map&lt;Object,String&gt;) @...

    SpringMVC配置多数据源实战

    在Controller层,根据业务需求,调用对应的Service方法,Service方法中通过`@Transactional`注解来指定使用哪个数据源。 7. **注意点** - 确保数据库驱动已添加到项目依赖。 - 在实际业务中,可能需要根据具体...

    springMVC和mybatis整合,mybatis使用注解模式

    接下来,我们可以在SpringMVC的Controller层使用@Autowired注解注入Mapper接口的实现,这样就可以直接调用接口中的方法执行数据库操作。例如,我们可以定义一个UserMapper接口,包含获取用户信息的selectUser方法,...

    SpringMVC Controller解析ajax参数过程详解

    在这里,我们使用了`@Controller`注解来标记Controller类,并使用`@RequestMapping`注解来映射请求URL。 2. ajax请求的工作原理:ajax(Asynchronous JavaScript and XML)是一种异步请求技术,允许Web页面在不刷新...

    springmvc事务配置在service.zip

    在Service层的类或者方法上使用@Transactional注解,可以声明该方法需要在事务中执行。例如: ```java @Service public class UserService { @Transactional public void createUser(User user) { // ...

    springMVC解决中文乱码

    例如,我们可以在 Controller 中使用 `@RequestMapping` 注解,并添加 `produces` 属性来指定字符编码: ```java @RequestMapping(value = "/hello", produces = "text/html;charset=UTF-8") public String hello()...

    SpringMVC+JDBC快速搭建(使用注解)

    在使用注解的SpringMVC中,我们通常会使用@Controller、@RequestMapping等注解来标记控制器类和处理请求的方法。 1. **控制器(Controller)**:使用`@Controller`注解标记类,表明这个类是一个处理HTTP请求的控制...

    Springmvc Controller接口代码示例

    在上面的代码中,我们使用了`@Controller`注解来标记ControlFlight类是一个Controller接口,然后使用`@RequestMapping`注解来指定该Controller接口的请求映射。 三、SimpleUrlHandlerMapping的作用 ...

    SpringMVC使用JSON的Jackson的jar包

    默认情况下,如果项目中包含Jackson库,SpringMVC会使用`MappingJackson2HttpMessageConverter`作为MessageConverter,实现JSON序列化。 5. 配置SpringMVC以使用Jackson: 虽然SpringMVC通常会自动检测并使用...

    跟开涛学SpringMVC(4.3)Controller接

    通常,Controller类会使用@Controller注解标识,而处理方法则使用@RequestMapping、@GetMapping、@PostMapping等注解进行请求映射。 2. **模型数据和视图解析**:Controller处理完请求后,可能会需要返回数据到视...

Global site tag (gtag.js) - Google Analytics