Kum*_*mar 4 java spring transactions spring-mvc
我正在使用Spring 3 MVC,我在注入Objects时遇到了问题.我创建了控制器对象@Controller.我用@ServiceObject 创建了一个服务对象.我用AutoWire在服务器中注入了服务对象.我创建了DAO对象,并注入了服务对象,并测试了应用程序,它运行正常.然后我戴上@Transactional了DAO,然后它也运行良好.但是,当我把@Transactional服务对象,它给我的问题.在部署时,在控制器上它称为"
上下文初始化失败:org.springframework.beans.factory.BeanCreationException:创建名为'loginController'的bean时出错:注入自动连接的依赖项失败; 嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配方法:public void com.erudicus.controller.LoginController.setLoginService(com.erudicus.model.service.LoginServiceImpl); 嵌套异常是java.lang.IllegalArgumentException:参数类型不匹配".
这是代码控制器
@Controller
public class LoginController {
private static Logger LOG = Logger.getLogger(LoginController.class);
private LoginServiceImpl loginService = null;
public LoginServiceImpl getLoginService() {
return loginService;
}
@Autowired
public void setLoginService(LoginServiceImpl loginService) {
this.loginService = loginService;
}
@RequestMapping(value="/login" , method= RequestMethod.GET)
public String login(Model model) {
model.addAttribute(new Login());
return "login";
}
@RequestMapping(value="/loginDetails", method=RequestMethod.POST)
public ModelAndView create(@Valid Login login, BindingResult result) {
}
}
Run Code Online (Sandbox Code Playgroud)
服务对象
@Service
public class LoginServiceImpl implements LoginService {
private LoginDao loginDao = null;
public LoginDao getLoginDao() {
return loginDao;
}
@Autowired
public void setLoginDao(LoginDao loginDao) {
this.loginDao = loginDao;
}
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public Login getUserDetails(String userId) {
return getLoginDao().getUserDetails(userId);
}
}
Run Code Online (Sandbox Code Playgroud)
道
@Service
@Transactional(propagation = Propagation.MANDATORY)
public class LoginDaoImpl extends SqlSessionDaoSupport implements LoginDao {
@Transactional(readOnly = true, propagation = Propagation.MANDATORY)
public Login getUserDetails(String userId) {
}
}
Run Code Online (Sandbox Code Playgroud)
在我指定的配置中
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<!-- enable autowire -->
<!-- enable transaction demarcation with annotations -->
<tx:annotation-driven transaction-manager="txManager"/>
<context:annotation-config/>
Run Code Online (Sandbox Code Playgroud)
任何人都可以请求帮助
Boz*_*zho 11
将字段定义为接口,而不是具体类.(所以UserService而不是UserServiceImpl).您可以@Transactional在具体类上添加注释 - 它将起作用.
问题是默认情况下spring使用JDK代理(java.lang.reflect.Proxy),它们是仅接口代理.然后,调用处理程序会使用您的具体类,但您无法转换它.
如果没有接口,spring会使用另一个方法 - CGLIB,它为目标类创建子类以生成代理.
您可以使用每个bean <aop:scoped-proxy />配置代理stragegy(proxy-target-class).
| 归档时间: |
|
| 查看次数: |
9200 次 |
| 最近记录: |