在处理当前的 Spring 和 Hibernate 应用程序时,我遇到了另一个问题。我已经构建了我的 DAO 接口(interface)/类,以及我的服务接口(interface)/类,当然还有实体。
一切都部署得很好,但是当我向 XXXServiceImpl 类添加 @Transactional
注释时,我在部署过程中遇到以下异常(在 Glassfish 和 Tomcat 上测试):
Caused by: java.lang.IllegalStateException: Cannot convert value of type [com.sun.proxy.$Proxy25 implementing net.dreamcode.bleevle.persistence.service.IntranetService,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.dreamcode.bleevle.persistence.service.impl.IntranetServiceImpl] for property 'intranetService': no matching editors or conversion strategy found
当然,我试图找到一些相关内容,我想这基本上是因为添加注释时接口(interface)和类不匹配。但我也尝试在我的接口(interface)上添加注释,这并没有帮助解决问题,产生与上面所述相同的错误。
以下是我的项目中的一些示例代码(BasicService
、UserService
和 UserServiceImpl
):
基本服务(接口(interface)):
public interface BasicService<T> {
T findById(String id);
void create(T entity);
void delete(T entity);
void update(T entity);
}
用户服务(接口(interface)):
import net.dreamcode.bleevle.data.User;
public interface UserService extends BasicService<User> {
User findByName(String name);
}
UserServiceImpl(类):
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
@Override
public User findByName(String name) {
return userDao.findByName(name);
}
@Override
public User findById(String id) {
return userDao.findById(id);
}
@Override
public void create(User entity) {
userDao.create(entity);
}
@Override
public void delete(User entity) {
userDao.delete(entity);
}
@Override
public void update(User entity) {
userDao.update(entity);
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
使用这种模式时是否需要做特定的事情(我猜这是某种带有 Service 和 Dao 内容的设计模式)?
非常感谢任何形式的帮助。提前致谢!
最佳答案
你有特性
@Autowired private IntranetServiceImpl intranetService;
(或其等效项,例如带注释的构造函数参数或 setter),其类型是您的服务的实现类型。这是错误的:您应该始终使用属性的接口(interface)类型。
它之所以失败,但不早于您使用@Transactional进行注释的原因是,该注释会导致Spring创建接口(interface)的动态代理,否则就会出现裸露的实现类实例。此动态代理无法向下转换为您的实现类型,但会成功转换为接口(interface)类型。
关于java - Spring/Hibernate 应用程序仅在没有 @Transactional 的情况下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874237/