스프링 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" />
내 수입을 검사했는데 올바른 클래스 (나는 그것을 재 검증하여 FarmerAdvisor라고 불렀다.) 그러나 트랜잭션 주석이 인터페이스 구현에 추가되기 전에 get 메소드가 작동하기 때문에 문제가 발생할 가능성은 낮습니다. 또한 불행하게도 이것은 새로운 구현이며 항상 목록을 반환하고 구현은 트랜잭션 주석 없이도 작동하므로 이전 인터페이스 구현이 될 수 없습니다. ( – Leanne
아아, 귀하의 게시물을 통해 문제가 응용 프로그램이 내 구현보다는 getAdvisors() Spring Advisor 버전을 호출하는 이유가 무엇인지 모르겠지만 이유는 모르겠지만 내 메서드 이름을 변경하여 문제를 해결했습니다. 모든 기회 중에서 내가 권고 클래스라는 클래스를 구현하려고합니다. 감사합니다. 도움을 청하고 두통에서 나를 구 해주셔서 감사합니다. – Leanne
당신은 대답을 유용하다고 생각한다면 그것을 수락 한 것으로 표시 할 수 있습니다. – Bozho