2014-07-21 22 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

相關問題