2014-07-21 20 views
0

我在处理当前的Spring和Hibernate应用程序时遇到了另一个问题。我已经构建了我的DAO接口/类,以及我的服务接口/类,当然还有实体。只有在没有@Transactional的情况下,Spring/Hibernate应用程序才能正常工作

一切都被部署好,但只要我的@Transactional注释添加到我的XXXServiceImpl班,我得到部署在以下异常(在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 

当然,我试着找到有关的东西,我想这基本上是因为接口和类在添加注释时不匹配。但是我也尝试在我的界面上添加注释,这无助于解决问题,并产生了与上述相同的错误。

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

BasicService(接口):

public interface BasicService<T> { 

    T findById(String id); 
    void create(T entity); 
    void delete(T entity); 
    void update(T entity); 

} 

UserService(接口):

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; 
    } 
} 

是否与这种模式(我想这是某种设计模式与服务,并道的东西)工作时做具体的事情?

任何形式的帮助,非常感谢。提前致谢!

回答

2

你有一个属性

@Autowired private IntranetServiceImpl intranetService; 

(或等价物,如注释构造函数的参数或一个setter),其类型为您服务实现类型。这是错误的:你应该总是使用你的属性的接口类型。

为什么它最早失败,但不早于你用@Transactional注解的原因是这个注解导致Spring为你的接口创建一个动态代理,否则就会有裸类实现类实例。这个动态代理无法落实到您的实现类型中,但会成功转换为接口类型。

+0

非常感谢!即使我没有在我的类中使用IntranetServiceImpl属性,setter将实现作为参数。现在我得到了与MySQL不同的错误,但我想我可以自己解决,再次感谢你! – MrPixelDream

相关问题