gpt4 book ai didi

java - 由于 JDK 代理而导致 UnsatisfiedDependencyException

转载 作者:行者123 更新时间:2023-11-30 01:48:34 27 4
gpt4 key购买 nike

我尝试使用 Spring 提供的默认 aop 代理,但出现执行错误。

这是我的代码:运行测试示例的第一个类。

@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 );
}

我遇到的异常(exception)是向服务对象注入(inject) dao 对象。

UnsatisfiedDependencyException: Error creating bean with name 'myService': Unsatisfied dependency expressed through field 'myDaoRepository'; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'myDaoRepository' is expected to be of type 'aop.question_005.dao.MyDaoRepository' but was actually of type 'com.sun.proxy.$Proxy22'

我可以通过启用 GCLIB 机制来解决这个问题,但我想知道如何使用相同的 JDK 动态代理来解决这个问题?

最佳答案

代码中的问题是您使用类 MyDaoRepository 而不是 dao 接口(interface)。您可以将代理强制转换为接口(interface) dao,但不能将其强制转换为其实现。您需要修改服务代码才能使用接口(interface):

@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);
}
}

关于java - 由于 JDK 代理而导致 UnsatisfiedDependencyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56901276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com