UnsatisfiedDependencyException из-за JDK-прокси - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь использовать прокси-сервер по умолчанию, предоставляемый Spring, но получаю ошибку при исполнении.

Вот мой код: Первый класс, который запускает тестовый пример.

@EnableAspectJAutoProxy()
@ComponentScan(basePackageClasses = {MyDaoRepository.class, MyService.class,MyAdvices.class})
@Configuration
public class SpringAdvices {
   public static void main( String[] args ) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringAdvices.class);
        service myService = ctx.getBean(MyService.class);
        Person p1 = (Person) ctx.getBean("person");
        myService.save(p1);

    }
     @Bean
     public Person person(){
            return Person.builder()
                    .name("Bagna")
                    .age(52)
                    .profession(null)
                    .dateOfBirth(LocalDate.of(1950,12,13))
                    .build();
        }

}

Второй класс, который представляет мои советы:

@Aspect
@Component
public class MyAdvices {
    @Before("execution(boolean *.dao.save(..))")
    public void beforesavamethod(){
        System.out.println("beforesavamethod");
    }
    @After("execution(boolean *.dao.save(..))")
    public void aftersavamethod(){
        System.out.println("aftersavamethod");
    }
}

Мои классы обслуживания и хранилища:

@Service
public class MyService implements service {
    @Autowired
    MyDaoRepository myDaoRepository;

    @Override
    public boolean save( Person person ){
        return this.myDaoRepository.save(person);
    }
    @Override
    public boolean delete(Person person){
        return  this.myDaoRepository.delete(person);
    }
}

public interface service {
    public  boolean save( Person person );
    public  boolean delete( Person person );
}
@Repository
public class MyDaoRepository implements dao {
    List<Person> personList = new ArrayList<>();

    @Override
    public boolean save( Person person ){
        return this.personList.add(person);
    }

    @Override
    public boolean delete( Person person ){
        return  this.personList.remove(person);
    }
}
public interface dao {
    public boolean save( Person person );

    public boolean delete( Person person );
}

Исключение, которое я получаю, касается внедрения объекта dao в объект службы.

UnsatisfiedDependencyException: Ошибка при создании бина с именем 'myService': неудовлетворенная зависимость, выраженная через поле 'MyDaoRepository'; вложенное исключение org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean с именем 'myDaoRepository', как ожидается, будет иметь тип 'aop.question_005.dao.MyDaoRepository', но на самом деле был типа 'Com.sun.proxy. $ Proxy22'

Я могу решить эту проблему, включив механизм GCLIB, но мне интересно, как я могу решить эту проблему, используя тот же динамический прокси JDK?

1 Ответ

2 голосов
/ 05 июля 2019

Проблема в вашем коде в том, что вы используете класс MyDaoRepository вместо интерфейса dao.Вы можете привести свой прокси к интерфейсу dao, но вы не можете привести его к его реализации.Вам необходимо изменить код службы для использования интерфейсов:

@Service
public class MyService implements service {
    @Autowired
    dao myDaoRepository;

    @Override
    public boolean save( Person person ){
        return this.myDaoRepository.save(person);
    }
    @Override
    public boolean delete(Person person){
        return  this.myDaoRepository.delete(person);
    }
}
...