2011-09-21 1 views
0

스프링 MVC에서 개발 된 Restful 웹 서비스가 현재 농부 정보를 반환하며 데이터베이스에 새 농부를 삭제하고 추가 할 수 있습니다. 최대한 빨리 고문의 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 인터페이스 :

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 Advisor 버전을 호출하는 이유가 무엇인지 모르겠지만 이유는 모르겠지만 내 메서드 이름을 변경하여 문제를 해결했습니다. 모든 기회 중에서 내가 권고 클래스라는 클래스를 구현하려고합니다. 감사합니다. 도움을 청하고 두통에서 나를 구 해주셔서 감사합니다. – Leanne

+0

당신은 대답을 유용하다고 생각한다면 그것을 수락 한 것으로 표시 할 수 있습니다. – Bozho