我正在使用Spring 3 MVC,我在注入Objects时遇到了问题。
我使用@Controller
创建了控制器对象。我用@Service
对象创建了一个服务对象。我用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) {
}
}
服务对象
@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);
}
}
道
@Service
@Transactional(propagation = Propagation.MANDATORY)
public class LoginDaoImpl extends SqlSessionDaoSupport implements LoginDao {
@Transactional(readOnly = true, propagation = Propagation.MANDATORY)
public Login getUserDetails(String userId) {
}
}
在我指定的配置
中<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/>
任何人都可以请求帮助
答案 0 :(得分:11)
将字段定义为接口,而不是具体类。 (所以UserService
代替UserServiceImpl
)。您可以在具体类上添加@Transactional
注释 - 它将起作用。
问题是默认情况下spring使用JDK代理(java.lang.reflect.Proxy
),这些代理只是接口代理。然后,调用处理程序会使用您的具体类,但您无法强制转换它。
如果没有接口,spring会使用另一个方法 - CGLIB,它为目标类创建代理的子类。
您可以使用<aop:scoped-proxy />
为每个bean配置代理策略(proxy-target-class
)。