봄 데이터 awedomeness에서 영감을 얻었습니다. 많은 컨트롤러에서 확장 할 수있는 추상 RESTController를 만들고 싶었습니다. 내가 제네릭이 저장소에 @Autowired 날을 허용 것이라고 기대했다 그러나 나는 다음과 같은 오류 얻을spring @Autowired가 java generics와 함께 작동하지 않는 이유는 무엇입니까?
@Controller
public abstract class RESTController<E, PK extends Serializable, R extends PagingAndSortingRepository<E, PK>>
{
@Autowired
private R repository;
@RequestMapping(method=RequestMethod.GET, params={"id"})
@ResponseBody
public E getEntity(@RequestParam PK id)
{
return repository.findOne(id);
}
...
}
:
SEVERE: Allocate exception for servlet appServlet
org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [org.springframework.data.repository.PagingAndSortingRepository] is defined: expected single matching bean but found 3: [groupRepository, externalCourseRepository, managedCourseRepository]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:800)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
을 나는 오류가 나에게 말하고 이해 나는 다음과 같은 클래스를 생성 @Autowired에 대해 하나 이상의 일치 항목이 있습니다.
@Controller
@RequestMapping(value="/managedCourse")
public class ManagedCourseController extends RESTController<ManagedCourse, Long, ManagedCourseRepository>
{
...
}
이것은 RESTController이 같은 방법을 가지고 수행하여 해결할 수있을만큼 간단하다 :
protected abstract R getRepository();
을하고 일을 내가 일하는 것이 다음 컨트롤러를 생성하여 생각했기 때문에 나는 혼란 스러워요 구현 클래스의 다음과 같습니다.
@Autowired
private ManagedCourseRepository repository;
@Override
protected ManagedCourseRepository getRepository()
{
return repository;
}
나는이 작업을 수행 할 수있는 방법에 대한 생각이 있는지 궁금합니다.
또한 this 흥미로운 aritcle을 발견했습니다.
작동하는지 모르겠지만 'Autowired'외에 '한정자'주석을 사용해보십시오. – Dani
무언가를 놓친다면 용서해주세요.하지만 구현 클래스를 모르는 경우 추상 클래스 도움말에 한정자를 추가하면 어떻게됩니까? 당신의 응답에 감사드립니다. 설명 해주십시오. – testing123