2012-08-27 21 views
6

tôi có các khía cạnh sau:Không có phương pháp nhà máy phù hợp được tìm thấy: phương pháp nhà máy 'aspectOf()'

package trc.suivi.aspects; 

import java.util.Date; 

import org.apache.log4j.Logger; 
import org.springframework.beans.factory.annotation.Autowired; 

import trc.suivi.domain.EvenementPli; 
import trc.suivi.domain.Pli; 
import trc.suivi.domain.TypeEvenement; 
import trc.suivi.repository.EvenementPliRepository; 

public aspect PliEventManagerAspect { 

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

    @Autowired 
    private EvenementPliRepository evenementPliRepository; 

    public PliEventManagerAspect() { 
    } 

    pointcut catchEMPersist(Pli pli) : (execution(* trc.suivi.repository.PliRepository+.save(*)) && args(pli)); 
    pointcut catchEMPersist() : (execution(trc.suivi.domain.Pli.persist())); 

    after(Pli pli) returning: catchEMPersist(pli) { 
     log.debug("catchEMPersist(pli)"); 
     EvenementPli ev = new EvenementPli(); 
     ev.setDateCreation(new Date()); 
     ev.setType(TypeEvenement.creation); 
     ev.setMessage("Création d'un pli"); 
     evenementPliRepository.save(ev);   
    } 

    after() returning: catchEMPersist() { 
     log.debug("catchEMPersist()"); 
     EvenementPli ev = new EvenementPli(); 
     ev.setDateCreation(new Date()); 
     ev.setType(TypeEvenement.creation); 
     ev.setMessage("Création d'un pli"); 
     evenementPliRepository.save(ev);   
    } 

} 

Và cấu hình xml sau:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> 
    <aop:aspectj-autoproxy /> 
    <bean class="trc.suivi.aspects.PliEventManagerAspect" factory-method="aspectOf"/> 
</beans> 

Khi tôi bắt đầu ứng dụng của tôi, tôi nhận được này:

No matching factory method found: factory method 'aspectOf()'. Check that a method with the specified name exists and that it is static. 

Tôi khá là chết lặng vì tôi khá chắc chắn cấu hình này hoạt động tốt trước đây. Hơn nữa, đây là một dự án Spring Roo nên tất cả các cấu hình aspectJ sẽ ổn.

Mọi người có thể giúp bạn không?

Trả lời

3

Đây có lẽ là bởi vì khía cạnh của bạn đã không được biên dịch vì lý do gì, bạn có thể thử và thêm chẩn đoán hơn để AspectJ thợ dệt plugin của bạn và xem những gì đang được in trên bàn điều khiển, cùng những dòng này:

<configuration> 
    <outxml>true</outxml> 
    <showWeaveInfo>false</showWeaveInfo> 
    <Xlint>warning</Xlint> 
    <verbose>true</verbose> 
       ... 
</configuration> 

Ngoài ra kể từ khi bạn đang sử dụng aspectj thô bạn không thực sự cần phải sử dụng <aop:aspectj-autoproxy/> được sử dụng để kích hoạt Spring AOP.

+0

Tôi đã có thể tìm hiểu lý do tại sao khía cạnh không được biên soạn nhờ đề xuất của bạn. Cảm ơn rất nhiều. – balteo

+0

@balteo, bạn có thể chỉ định câu trả lời cho vấn đề cụ thể của mình không? – alfredaday

+1

Khía cạnh của tôi chưa được biên dịch. Nếu máy của bạn không biên dịch, hãy thử cấu hình ở trên, bạn sẽ thấy các lỗi biên dịch. – balteo

2

Tôi đã nhận được thông báo lỗi tương tự xuất hiện. Tôi giải quyết nó bằng cách nhìn vào câu trả lời rozky ở đây: http://forum.springsource.org/showthread.php?79928-NoSuchMethodError-Aspect-aspectOf%28%29

Vì lợi ích của ghi câu trả lời, tôi đã sao chép nó ở đây:

rozky đã viết:

Hi,

tôi có cùng một vấn đề. Tôi phát hiện ra rằng dệt cần phải được kích hoạt cũng cho các lớp khía cạnh trong tập tin aop.xml. Trong trường hợp của bạn, đó là (xem phần được đánh dấu):

<!DOCTYPE aspectj PUBLIC 
     "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
<aspectj> 
    <weaver options="-verbose -showWeaveInfo -debug"> 
     <!-- only weave classes in our application-specific packages --> 
     <include within="com.mypackage.*"/> 
     <include within="foo.*"/> <!-- this is the highlighted line --> 
    </weaver> 
    <aspects> 
     <!-- weave in just this aspect --> 
     <aspect name="foo.ProfilingAspect"/> 
    </aspects> 
</aspectj> 

Hy vọng điều đó sẽ hữu ích.