Java spring 3@controller无法注入具有@Transactional的服务对象
我使用的是Spring3MVC,我在注入对象时遇到问题。 我用Java spring 3@controller无法注入具有@Transactional的服务对象,java,spring,spring-mvc,transactions,Java,Spring,Spring Mvc,Transactions,我使用的是Spring3MVC,我在注入对象时遇到问题。 我用@Controller创建了控制器对象。我已经用@Service对象创建了一个服务对象。我使用AutoWire将服务对象注入控制器中。 我创建了DAO对象,注入了服务对象,并测试了应用程序,它运行良好。 然后我把@Transactional放在DAO上,然后它也工作得很好。但当我将@Transactional放在服务对象上时,它给了我问题。在部署时,在控制器上显示为“ 上下文初始化失败:org.springframework.bean
@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.setLoginS服务(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);
}
}
刀
在我指定的配置中
<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/>
任何人都可以帮助将字段定义为接口,而不是具体的类。(因此是
UserService
而不是userserviceinpl
)。您可以在具体类上添加@Transactional
注释-它会起作用
问题是spring默认使用JDK代理(java.lang.reflect.Proxy
),它们是仅用于接口的代理。然后,调用处理程序将使用您的具体类,但您不能对其进行强制转换
如果没有接口,spring将使用另一个方法-CGLIB,该方法对目标类进行子类化以生成代理
您可以使用
来配置每个bean的代理策略(代理目标类
)。是的,它工作了,谢谢你,但我还有一个问题,Anotation没有继承,我的服务接口没有用@transaction注释,我在Concerte类中注释为@transaction,当控制器对具有事务集的服务执行某些操作时,事务将由服务加载。另外,请解释我早期版本的代码有什么问题。我也遇到了类似的问题,您的回答和解释帮助了我,谢谢!我也帮了忙。谢谢我想我可以快速地自动连接dao的三个层次,而不使用接口。它在两个层面上起作用。在第三阶段,它开始与代理合作。为什么?谜团:-)我问了一个类似的问题,这是否有帮助:
<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/>