Spring @重写和@Transactional注释

Spring @重写和@Transactional注释,spring,spring-mvc,jpa,Spring,Spring Mvc,Jpa,我使用jpa、eclispelink和spring3。我有UserDAO接口: public interface UserDAO { public void saveUser(User user); } @Service @Transactional public class UserDAOImpl { @PersistenceContext EntityManager em; public void saveUser(User user) { em.pers

我使用jpa、eclispelink和spring3。我有UserDAO接口:

  public interface UserDAO {
    public void saveUser(User user);
  }
 @Service
 @Transactional
 public class UserDAOImpl {
 @PersistenceContext
 EntityManager em;
  public void saveUser(User user) {
  em.persist(user);
  }
和实现类:

@Service
@Transactional
public class UserDAOImpl implements UserDAO{

@PersistenceContext
EntityManager em;

@Override
public void saveUser(User user) {
    em.persist(user);
}

启动应用程序时出现错误:

HTTP Status 500 - Servlet.init() for servlet appServlet threw exception<br>
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cartController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: foo.endpoints.UserEndpoint foo.controller.CartController.userEndpoint; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userEndpoint': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: foo.dao.UserDAOImpl foo.endpoints.UserEndpoint.userDAO; nested exception is java.lang.IllegalArgumentException: Can not set foo.dao.UserDAOImpl field foo.endpoints.UserEndpoint.userDAO to com.sun.proxy.$Proxy16

org.springframework.beans.factory.BeanCreationException: Could not autowire field: foo.endpoints.UserEndpoint foo.controller.CartController.userEndpoint; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userEndpoint': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: foo.dao.UserDAOImpl foo.endpoints.UserEndpoint.userDAO; nested exception is java.lang.IllegalArgumentException: Can not set foo.dao.UserDAOImpl field foo.endpoints.UserEndpoint.userDAO to com.sun.proxy.$Proxy16


一切正常。我不明白。也许是@Override方法的问题?谢谢

如果为bean定义接口,那么必须注入接口的实例,而不是具体类的实例:

@Autowired
private UserDAO userDAO;
而不是

@Autowired
private UserDAOImpl userDAOImpl;

因为实际的bean实例是实现接口并调用您的实现的JDK动态代理。它不是UserDAOImpl的实例。

如果为bean定义接口,则必须注入接口的实例,而不是具体类的实例:

@Autowired
private UserDAO userDAO;
而不是

@Autowired
private UserDAOImpl userDAOImpl;

因为实际的bean实例是实现接口并调用您的实现的JDK动态代理。它不是UserDAOImpl的实例。

我确信这个问题有一些完全相同的地方,基本上Spring的默认策略是,如果类实现了至少一个接口,则使用JDK代理,否则使用CGLIB代理。当使用JDK代理时,您将无法注入类,只有接口可用。顺便说一句,我认为惯例是使用
@Repository
而不是
@Service
@BorisTreukhov注释DAO类,这正是问题所在!!我已经搜索这些奇怪的问题很久了,我确信有一些问题是完全重复的,基本上Spring的默认策略是,如果类实现了至少一个接口,则使用JDK代理,否则使用CGLIB代理。当使用JDK代理时,您将无法注入类,只有接口可用。顺便说一句,我认为惯例是使用
@Repository
而不是
@Service
@BorisTreukhov注释DAO类,这正是问题所在!!我已经搜索这些奇怪的问题很久了,我相信第二段代码应该是
private UserDAOImpl UserDAOImpl对吗?是的。对不起,我认为第二段代码应该是
private-UserDAOImpl-UserDAOImpl对吗?是的。对不起,我犯了那个错误。