2017-06-18 3 views
0

Ich habe mit einigen @Bean Annotationen konfigurieren und es funktioniert. Aber wenn ich die Bean zu erben von der Schnittstelle ändern, ist es nicht funktionieren. Brauche ich spezielle Anmerkungen o etwas wie?Frühling injizieren Bean, die erben Form Schnittstelle

Config-Klasse-Schnipsel withot Importe

@Configuration 
@ComponentScan("io.github.aaa4") 
//@ComponentScan({ "io.github.aaa4.dao", "io.github.aaa4.entity","io.github.aaa4.Servlets"}) 
@EnableTransactionManagement 
public class AppConfig { 

    @Bean 
    public ComboPooledDataSource myDataSource() throws PropertyVetoException { 
     ComboPooledDataSource ds = new ComboPooledDataSource(); 

     ds.setDriverClass("com.mysql.jdbc.Driver"); 
     ds.setJdbcUrl("jdbc:mysql://localhost:3306/emp?useSSL=false"); 
     ds.setUser("emp"); 
     ds.setPassword("emp"); 
     ds.setMinPoolSize(2); 
     ds.setMaxPoolSize(20); 
     ds.setMaxIdleTime(30000); 

     return ds; 
    } 

    @Bean 
    public LocalSessionFactoryBean mySessionFactory() throws PropertyVetoException { 
     LocalSessionFactoryBean sf = new LocalSessionFactoryBean(); 
     Properties hibernateProperties = new Properties(); 
     hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); 
     hibernateProperties.setProperty("hibernate.show_sql", "true"); 

     sf.setDataSource(myDataSource()); 
     sf.setPackagesToScan("io.github"); 
     sf.setHibernateProperties(hibernateProperties); 

     return sf; 
    } 

    @Bean 
    @Autowired 
    public HibernateTransactionManager myTransactionManager(SessionFactory sessionFactory) { 
     HibernateTransactionManager htm = new HibernateTransactionManager(); 
     htm.setSessionFactory(sessionFactory); 

     return htm; 
    } 


    @Bean 
    public UserDao userDaoImpl() { 
     return new UserDaoImpl(); 
    } 

    @Bean 
    public DBService dBServiceImpl() { 
     return new DBServiceImpl(); 
    } 

} 

serviceImpl Snippet

@Service 
public class DBServiceImpl implements DBService { 

    //inject user DAO 
    @Autowired 
    private UserDao userDao; 

    @Transactional 
    public void addUser(MyUser user) { 
     userDao.createUser(user); 
    } 

    @Transactional 
    public List<MyUser> getUserList() { 
     return userDao.getusers(); 
    } 

    @Transactional 
    public void deleteUser(int theId) { 
     userDao.deleteUser(theId); 
    } 


} 

Hauptklasse

public class Main { 
public static void main(String[] args) { 
     AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); 

     DBServiceImpl service = ctx.getBean(DBServiceImpl.class); 

     MyUser user = new MyUser("alice", "and her passwd"); 
     System.out.println("this is the user:" + user); 
     service.addUser(user); 
     service.addUser(user); 
     service.addUser(user); 
     service.addUser(user); 
     System.out.println("User added!"); 
     service.deleteUser(2); 
     System.out.println("user number id = 2 deleted"); 
     List<MyUser> userList = service.getUserList(); 
     for (MyUser users : userList) 
      System.out.println(users); 
     ctx.close(); 
    } 

} 

Stacktrace mit Problem

INFO: Using DataSource [com.mchange.v2.c3p0.ComboPooledDataSource[ identityToken -> 1hge1459o1fr6qmlst9469|42e99e4a, dataSourceName -> 1hge1459o1fr6qmlst9469|42e99e4a ]] of Hibernate SessionFactory for HibernateTransactionManager 

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'io.github.aaa4.services.DBServiceImpl' available 

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353) 

    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340) 

    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1093) 
    at io.github.aaa4.Main.main(Main.java:30) 

mit Anmerkung @EnableAspectJAutoProxy (proxyTargetClass = true) oberhalb der Config-Klasse

WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around 
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:223) 
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:702) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:527) 
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84) 
    at io.github.aaa4.Main.main(Main.java:14) 
Caused by: java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around 
    at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.<clinit>(ReflectiveAspectJAdvisorFactory.java:77) 
    at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.initBeanFactory(AnnotationAwareAspectJAutoProxyCreator.java:78) 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.setBeanFactory(AbstractAdvisorAutoProxyCreator.java:60) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1647) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1615) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) 
    ... 10 more 
Caused by: java.lang.ClassNotFoundException: org.aspectj.lang.annotation.Around 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 16 more 
+0

Könnten Sie überprüfen, dass entweder die 'aspectjtools' oder' aspectjweaver' Libs, gibt es in Ihrer Anwendung classpath – AntJavaDev

Antwort

0

versuchen, eine Schnittstelle anstelle einer Implementierung

DBService service = ctx.getBean(DBService.class); 

Sie haben @Transactional Anmerkungen auf Ihren Service-Methoden zu verwenden. Alle @Transactional Annotationen sollten beim Start gescannt werden und die Zielmethoden sollten transaktional werden. So fügen Sie Transaktionsverhalten hinzu Spring erstellt einen Proxy für Ihre Klasse. Deshalb kannst du deine Bohne nicht bekommen.

+0

Ich habe es zweimal versucht und bekomme so etwas wie: verursacht durch: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean namens 'DBServiceImpl' wird erwartet, dass vom Typ 'io.github.aaa4.services.DBServiceImpl' aber war eigentlich vom Typ 'com.sun.proxy. $ Proxy29' – NyansusCoder

+0

Haben Sie genau den gleichen Code wie verwendet Ich erwähnte oben? –

+0

und wie man es repariert? Verwenden Sie nicht die Schnittstelle? IMHO ist es schlecht. – NyansusCoder

0

Ich denke, sollten Sie Änderungen in dieser Zeile DBServiceImpl service = ctx.getBean(DBServiceImpl.class);-DBService service = ctx.getBean(DBService.class);

Referenz Prüfungsfeder doc machen Using the @Bean annotation Spring DOC

+0

Ich habe es versucht. schau dir die Antwort unten an. – NyansusCoder

Verwandte Themen