java - Spring/Hibernate 应用程序仅在没有 @Transactional 的情况下工作

标签 java hibernate spring-mvc

在处理当前的 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)上添加注释,这并没有帮助解决问题,产生与上面所述相同的错误。

以下是我的项目中的一些示例代码(BasicServiceUserServiceUserServiceImpl):

基本服务(接口(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/

相关文章:

JAVA Spring 返回图像字节 - 错误 406 Not Acceptable

java - 这是很简单的java代码,但是无法识别错误。我收到语法错误

java - 将 tomcat(作为 Spring tcServer)重定向到不同的端口

java - MessageFormat header/footerFormat 如何更改 JTable 打印的字体

java - 提交到数据库时执行一些常见的操作

java - 如何使用 Hibernate 尽可能快地插入数据

java - 鉴别器公式

java - Hibernate 事件监听器模式

java - Spring中使用Map进行绑定(bind) - Thymeleaf

java - 装箱值被拆箱,然后立即重新装箱