Spring @重写和@Transactional注释
我使用jpa、eclispelink和spring3。我有UserDAO接口: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
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代码>对吗?是的。对不起,我犯了那个错误。