У меня есть веб-служба Restful, разработанная в Spring MVC, которая в настоящее время возвращает информацию о фермерах и позволяет удалять и добавлять новых фермеров в базу данных. При расширении веб-службы для включения консультантов фермеров я получаю следующую ошибку, как только добавляю примечание транзакции к реализации DAO консультанта:
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 Advisors:
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" />