Проблема конфигурации Spring после реализации Spring AOP - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь реализовать Spring AOP в многоуровневом приложении и даю советы для классов @Service и @Controller.

Все отлично работает без класса аспекта.Когда я добавляю эту часть кода, это вызывает проблему конфигурации Spring.

@ Класс аспекта:

@Aspect
@Component
public class ApplicationMonitor {
private static final Logger logger = Logger.getLogger(ApplicationMonitor.class);

@Pointcut(value = "execution(* hr.mycompany.controller.impl.MyCompanyController.update(*)) && args(obj)") 
public void updateMC(Object obj){}

@Before(value="updateMC(obj)")
public void beforeUpdateMC(JoinPoint jp, Object obj) {
    Object obj = jp.getArgs()[0];
    logger.info("beforeUpdateMC " + obj);
}

}

Настройка аспекта Spring XML:

<aop:aspectj-autoproxy proxy-target-class="true"/>

Классы приложений @Controller и @Service:

@Controller 
public class MyCompanyController implements IMyCompanyController{

    @Autowired
    private IMyComapnyService myCompanyService;

}


@Service
public class MyCompanyService implements IMyComapnyService {

    @Autowired
    private IGenericHibernateDao<Object, Integer>  vwObjectDao;

}

Ошибка:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [hr.mycompany.dao.IGenericHibernateDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}


09:11:27,871 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/BasicData-portlet]] (http--0.0.0.0-8083-2) StandardWrapper.Throwable: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'MyCompanyService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private hr.mycompany.dao.IGenericHibernateDao hr.mycompany.services.impl.MyCompanyService.vwObjectDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [hr.mycompany.dao.IGenericHibernateDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Где проблема?

РЕДАКТИРОВАТЬ:

Часть класса с методами Hibernate:

@Transactional(readOnly = true)
public abstract class GenericHibernateDao<T, PK extends Serializable> implements IGenericHibernateDao<T, PK> {

    private static final Logger log = LoggerFactory.getLogger(GenericHibernateDao.class);

    @Autowired
    @Qualifier(value = "hibernateSessionFactory")
    protected SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public SessionFactory getSessionFactory() {

        return sessionFactory;
    }

    @SuppressWarnings("unchecked")
    @Transactional(readOnly = false)
    public PK save(T entity) {
        Assert.notNull(entity, "Argument entity cannot be null in a call to GenericHibernateDao.save !");

        Session session = getSessionFactory().getCurrentSession();

        return (PK) session.save(entity);
    }

    ...

}

EDIT (22-02-2019):

Когда я изменяю эту строку кода:

<aop:aspectj-autoproxy proxy-target-class="true"/>

, как это:

<aop:aspectj-autoproxy />

Ошибка исчезает, но аспект не работает.

1 Ответ

0 голосов
/ 26 февраля 2019

Я нашел решение.

Я изменил эту строку кода в конфигурационном файле Spring XML:

<aop:aspectj-autoproxy proxy-target-class="true"/> 

Я установил для proxy-target-class значение false:

<aop:aspectj-autoproxy proxy-target-class="false"/> 

Я удалил эту зависимость из файла pom.xml:

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2</version>
</dependency> 

Я установил ту же версию Spring-aop, что и версию Spring, которую я использую в конфигурационном файле Spring XML.

Я изменил это:

http://www.springframework.org/schema/aop/spring-aop.xsd

вот так:

http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
...