2

エラー

SEVERE: Servlet.service() for servlet [appServlet] in context with path [/callcentre] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: object is not an instance of declaring class
HandlerMethod details: 
Controller [$Proxy109]
Method [public final java.lang.String au.com.mycompany.web.controllers.DummyControllerImpl.dummy()]
Resolved arguments: 
] with root cause
java.lang.IllegalArgumentException: object is not an instance of declaring class
...

メイヴンの依存関係

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${spring.framework.version}</version>
    </dependency>   

SERVLET-CONTEXT.XML

<aop:aspectj-autoproxy />

側面

@Aspect
@Component
public class JsonAspect {

    @Before("execution(public * au.com.mycompany.web.controllers.DummyController.dummy(..))")
    public final void beforeMethod1(final JoinPoint joinPoint) {
        System.out.println("Intercepted.............");
        System.out.println(joinPoint.getSignature().getName());
    }

}

コントローラーインターフェース

@Controller
public interface DummyController {

    @RequestMapping(value = "/dummy", method = RequestMethod.GET)
    @ResponseBody
    String dummy();

}

コントローラ実装

@Controller
public class DummyControllerImpl implements DummyController {

    @Override
    public final String dummy() {
        System.out.println("IT WORKED..........");
        return "it returned";
    }
}
4

1 に答える 1

1

これはもう関係ないと思いますが、まったく同じ問題があり、解決策はアプリケーションコンテキストでこれを設定することでした:

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

根本的な原因は、このクラス用に生成された AOP 自動プロキシが、CGLIB によって生成されたプロキシではなく JdkAutoProxy であることです。これにより、プロキシがコントローラーと同じタイプではないため、Spring MVC の API 呼び出しが失敗します。この JdkAutoProxy の理由は、この特定のコントローラーがインターフェースを実装しているためです。これにより、Spring は自動的に JDK 自動プロキシを使用します。

于 2015-10-28T07:31:20.243 に答える