Java spring 3@controller无法注入具有@Transactional的服务对象

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

我使用的是Spring3MVC,我在注入对象时遇到问题。 我用
@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/>