2013-10-29 68 views
3

我使用spring AOP進行日誌記錄。該應用程序工作正常,如果我取消註釋這些行java.lang.NoSuchMethodException:com.sun.proxy ..... on struts2 actions

@Before("bean(*Action)") 
public void logActionEnter(JoinPoint jp) { 
    log.info("Entering action: " + jp.getSignature().getName()); 
} 

我只是想知道。這應該起作用,但顯然沒有。

java.lang.NoSuchMethodException: com.sun.proxy.$Proxy630.login() 
    java.lang.Class.getMethod(Class.java:1655) 
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.getActionMethod(AnnotationValidationInterceptor.java:75) 
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:47) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171) 
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:161) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246) 
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54) 
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563) 
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) 
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) 
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    java.lang.Thread.run(Thread.java:724) 

如果你是interesterd,該login()方法

public String login() throws Exception { 
    String name = getAuthService().loginUser(username, password); 

    if(name == null) { 
     setType("not_found"); 
     return "failed"; 
    } 
    if(name.equals("LOCKED")) { 
     setType("is_locked"); 
     return "failed"; 
    } 
    if(name.equals("LOCKED_LOG")) { 
     setType("login_lock"); 
     return "failed"; 
    } 

    if(name.isEmpty()) { 
     setType("auth_failed"); 
     return "failed"; 
    } 

    if(session.containsKey("user")) return "session-active"; 

    User user = getAuthService().setUserActiveNow(username); 

    session.put("user", username); 
    session.put("completeName",name); 
    session.put("access", getAuthService().getFunctionAccess(username)); 
    session.put("loginDate", user.getLastLoginDt()); 
    session.put("userId", user.getId()); 

    getAuditLogService().writeLog(username, new Date(), 
      ServletActionContext.getRequest().getRequestURL().toString(), username + ":" + name + " logged in to IVRBO"); 

    return "success-login"; 
} 

編輯:我也有這個類的一個validate()方法。

編輯:這裏的XML

<?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:context="http://www.springframework.org/schema/context" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-3.1.xsd 
          http://www.springframework.org/schema/aop 
          http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> 

    <!-- beans here --> 

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

    <context:component-scan base-package="com.bdo.ivr" /> 

</beans> 

的方面。我使用了註釋。

import org.apache.log4j.Logger; 
import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.AfterThrowing; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.springframework.stereotype.Component; 

@Component 
@Aspect 
public class LoggingAspect { 

    Logger log = Logger.getLogger(this.getClass()); 

    @Before("bean(*Action)") 
    public void logActionEnter(JoinPoint jp) { 
     log.info("Entering action: " + jp.getSignature().getClass() + ": " + jp.getSignature().getName()); 
    } 

    @Before("bean(*Service)") 
    public void logServiceEnter(JoinPoint jp) { 
     log.info("Entering service: " + jp.getSignature().getClass() + ": " + jp.getSignature().getName()); 
    } 

    @Before("bean(*Dao)") 
    public void logDaoEnter(JoinPoint jp) { 
     log.info("Entering DAO: " + jp.getSignature().getClass() + ": " + jp.getSignature().getName()); 
    } 

    @AfterThrowing(pointcut = 
      "bean(*Service) || bean(*Dao)", 
      throwing = "e") 
    public void logException(Exception e) { 
     log.error("Exception", e); 
    } 

} 
+1

檢查相應的罐子... – Ashish

+0

@Ashish我有需要的罐子。我還將AOP應用於服務和DAO層,並且工作正常。當我取消註釋上面的代碼時,我的應用程序纔會崩潰。 – makalshrek

+0

@SciasTwentyThree您可以發佈您的應用程序類路徑中的jar列表。這可能是因爲你有jar,但是你沒有包含應用程序運行時查找的方法的適當版本,或者根本沒有jar。 –

回答

4

Spring缺省代理你的豆JDK代理只實現你的類的接口,而不是他們實際的類。如果login()方法只出現在實際的類上,則代理不會聲明它。

放在你的classpath CGLIB罐子和設置

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

讓Spring使用了代理實際的類類型。

+0

我已經把'cglib-3.0.jar'。現在出現該頁面,但是,看起來我的代碼沒有正確執行。例如,'login()'方法實際上被調用,但我無法登錄到我的應用程序。該應用程序只是讓我回到登錄頁面。 – makalshrek

+0

@SciasTwentyThree沒有更多的細節,我們不能說。您是否嘗試過調試以查看所謂的什麼和不是什麼? –

+0

對不起,我現在工作。問題是我錯誤地配置了登錄處理的bean。謝謝! – makalshrek