2015-09-19 34 views
0

我的目標是攔截ConnectionStatus方法ConnectController類,這是的春社交網絡部分:使用AOP攔截春天社會控制

完整的方法植入:

/** 
* Render the status of the connections to the service provider to the user as HTML in their web browser. 
*/ 
@RequestMapping(value="/{providerId}", method=RequestMethod.GET) 
public String connectionStatus(@PathVariable String providerId, NativeWebRequest request, Model model) { 
    setNoCache(request); 
    processFlash(request, model); 
    List<Connection<?>> connections = connectionRepository.findConnections(providerId); 
    setNoCache(request); 
    if (connections.isEmpty()) { 
     return connectView(providerId); 
    } else { 
     model.addAttribute("connections", connections); 
     return connectedView(providerId);   
    } 
} 

我有以下幾方面要點削減上述方法:

import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.ui.Model; 
import org.springframework.web.context.request.NativeWebRequest; 

@Aspect 
public class SocialConnectionAspect { 

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

    @Around("execution(* org.springframework.social.connect.web.ConnectController.connectionStatus(..))") 
    public void processSocialConnesction(final ProceedingJoinPoint pjp) throws Throwable { 
     log.debug(pjp.getSignature().toLongString()); 
     Object[] args = pjp.getArgs(); 
     for (Object arg : args) { 
      log.debug(arg.getClass().getSimpleName()); 
      boolean b = arg instanceof String; 
      log.debug("is String: " + b); 
      b = arg instanceof Model; 
      log.debug("is Model: " + b); 
      b = arg instanceof NativeWebRequest; 
      log.debug("is NativeWebRequest: " + b); 
     } 
     pjp.proceed(args); 
    } 

} 

然而,每次我試圖讓社會連接時間,頁面拋出以下異常:

type Exception report 

message Request processing failed; nested exception is java.lang.IllegalStateException: The mapped controller method class 'org.springframework.social.connect.web.ConnectController' is not an instance of the actual controller bean instance 'com.sun.proxy.$Proxy89'. If the controller requires proxying (e.g. due to @Transactional), please use class-based proxying. 

description The server encountered an internal error that prevented it from fulfilling this request. 

    exception 

    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: The mapped controller method class 'org.springframework.social.connect.web.ConnectController' is not an instance of the actual controller bean instance 'com.sun.proxy.$Proxy89'. If the controller requires proxying (e.g. due to @Transactional), please use class-based proxying. 
    HandlerMethod details: 
    Controller [com.sun.proxy.$Proxy89] 
    Method [public org.springframework.web.servlet.view.RedirectView org.springframework.social.connect.web.ConnectController.connect(java.lang.String,org.springframework.web.context.request.NativeWebRequest)] 
    Resolved arguments: 
    [0] [type=java.lang.String] [value=twitter] 
    [1] [type=org.springframework.web.context.request.ServletWebRequest] [value=ServletWebRequest: uri=/myproject/connect/twitter;client=0:0:0:0:0:0:0:1;session=85AF73CB172D0682D4FDA52E66DFE149;user=test.username1] 

     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:965) 
     org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) 
     javax.servlet.http.HttpServlet.service(HttpServlet.java:646) 
     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) 
     javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
     org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
     org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
     org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:146) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:105) 
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) 
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
     org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
     org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
     org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
     org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343) 
     org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260) 
     org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:119) 
     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
  • 我不知道我在這兒做錯了。是否有可能切入這個春季控制器?
+0

該解決方案是在[文檔](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#aop-proxying)...和在例外消息中被暗示,但它不是很清楚。 – Augusto

+0

@Augusto我添加在文檔中提到,但我收到以下異常: ** 異常:無法生成類的CGLIB子類[ class org.springframework.social.connect.web.ConnectController]:此問題的常見原因包括使用最終類或不可見類;嵌套異常是java.lang.IllegalArgumentException:超類沒有空構造函數,但沒有給出參數** –

+0

控制器是否有無參數構造函數? – Augusto

回答

1

您必須啓用Spring使用CGLIB來代理你的,你用你的方面類:

@EnableAspectJAutoProxy(proxyTargetClass=true) 

在默認設置下,春季只使用Java代理。如果你的類沒有實現任何接口(在你的案例ConnectController),Java代理將無法工作,因此,需要一個CGLIB代理。

但在你的情況下,ConnectController沒有默認的構造函數,所以CGLIB也會失敗。你在使用哪個版本的Spring?從4.0開始,你可以使用Objenesis來實例化這些類。看看https://jira.spring.io/browse/SPR-10594

+0

我添加在文檔中提到,但我收到以下異常: **例外:無法生成類[class org的CGLIB子類.springframework.social.connect.web.ConnectController]:此問題的常見原因包括使用最終類或不可見類;嵌套異常是java.lang.IllegalArgumentException:超類沒有空構造函數,但沒有給出參數** –

+0

@SuleimanAlrosan我已編輯答案 – Ruben