2011-09-21 18 views
0

我在Spring MVC中開發了Restful web服務,該服務目前返回農民信息並允許刪除和添加新農民到數據庫。在擴展Web服務,只要我的事務註釋添加到顧問DAO實現包括農民的顧問,我recieving以下錯誤:@Transactional註釋導致實體上的不兼容的返回類型錯誤

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'advisorDAO' defined in class path resource [applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: methods with same signature getAdvisors() but incompatible return types: [interface java.util.List, class [Lorg.springframework.aop.Advisor;] 

關於此錯誤的奇數部分是系統正常編譯和在註解被添加到類之前打算,但是因爲我需要能夠將實體持久化到數據庫,所以交易是必需的。我知道這個錯誤意味着什麼,但我爲什麼在使用這個註解時只是一個問題而感到不知所措,而這個註釋甚至都不適用於編譯器所抱怨的方法。

的顧問DAO接口:

public interface AdvisorDAO { 
    public List<Advisor> getAdvisors(); 
    public Advisor getAdvisorByPk(int id); 
    public Advisor getAdvisorByFarmerID(int id); 
    public Advisor getAdvisorByAdvisorID(int id);  
    public void saveAdvisor(Advisor advisor); 
    public void deleteAdvisor(Advisor advisor); 
    public void updateAdvisor (Advisor advisor); 
} 

的接口實現:

public class JpaAdvisorDAO implements AdvisorDAO { 

@PersistenceContext 
private EntityManager entityManager; 

public void setEntityManager(EntityManager entityManager) { 
this.entityManager = entityManager; 
} 

@Override 
public List<Advisor> getAdvisors() { 
    return entityManager.createNamedQuery("Advisor.findAll").getResultList(); 
} 

@Override 
public Advisor getAdvisorByPk(int id) { 
    Query query = entityManager.createNamedQuery("Advisor.findByPK"); 
    query.setParameter("advisorPk", id); 
    return (Advisor) query.getSingleResult(); 
} 

@Override 
public Advisor getAdvisorByFarmerID(int id) { 
    Query query = entityManager.createNamedQuery("Advisor.findByFarmerId"); 
    query.setParameter("farmerId", id); 
    return (Advisor) query.getSingleResult(); 
} 

@Override 
public Advisor getAdvisorByAdvisorID(int id) { 
    Query query = entityManager.createNamedQuery("Advisor.findByAdvisorId"); 
    query.setParameter("advisorId", id); 
    return (Advisor) query.getSingleResult(); 
}  

@Override 
@Transactional 
public void saveAdvisor(Advisor advisor) { 
    entityManager.persist(advisor); 
} 

@Override 
@Transactional 
public void deleteAdvisor(Advisor advisor) { 
    entityManager.remove(entityManager.getReference(Advisor.class, advisor.getAdvisorPk())); 

} 

@Override 
@Transactional 
public void updateAdvisor (Advisor advisor) { 
    entityManager.merge(advisor); 
} 

使用的背景文件:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx.xsd" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"> 


<bean id="farmerDAO" class="com.test.cmsservice.persistance.JpaFarmerDAO" /> 
<bean id="advisorDAO" class="com.test.cmsservice.persistance.JpaAdvisorDAO" /> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="SpringRestService"/> 
    <property name="dataSource" ref="dataSource"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="showSql" value="true"/> 
       <property name="generateDdl" value="false"/> 
       <property name="databasePlatform" value="org.hibernate.dialect.DerbyDialect"/> 
      </bean> 
     </property> 
</bean> 
<context:annotation-config /> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver"/> 
    <property name="url" value="jdbc:derby://localhost:1527/SpringDBTest"/> 
    <property name="username" value="APP"/> 
    <property name="password" value="app"/> 
    </bean> 
    <tx:annotation-driven /> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    <property name="dataSource" ref="dataSource"/> 
    </bean> 
    <bean id="persistenceAnnotation" class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

回答

0

添加註釋不能改變返回類型。

首先,您可能導入了錯誤的類型 - Advisor也是彈簧類,因此請修復您的導入。

然後我懷疑你的接口的舊版本或它的實現是由類加載器加載的。異常消息說,其中一種方法返回List<Advisor>,另一種返回Advisor[]。確保一切都清理乾淨並且是最新的。

+0

我檢查了我的導入並且它們是正確的類(我重構了類,因此它被稱爲FarmerAdvisor是肯定的)。但是,在將事務註釋添加到接口實現之前get方法工作時,這不太可能是問題。此外,它不幸的是不能是一箇舊的接口實現,因爲這是一個新的實現,它總是返回一個列表,並且實現工作沒有事務註釋:( – Leanne

+0

啊!你的帖子讓我意識到問題是應用程序是出於某種原因調用getAdvisors()的Spring顧問版本而不是我的實現,我不知道爲什麼,但通過改變我的方法名稱解決了問題。在嘗試實現一個名爲advisors的類的所有機會中謝謝你謝謝你的幫助,並且讓我免於頭疼! – Leanne

+0

歡迎您。如果您認爲答案有用,您可以將其標記爲已接受。 – Bozho