2013-08-30 6 views
4

Кажется, у меня возникла проблема.@Async через прокси-классы создает исключение весной 3.2

У меня есть класс

@Component 
@Scope("prototype") 
public class MyClass extends BaseClass { 

.... 
... 
@Async 
public void doSomething() { 
.... 
} 
.... 
} 

и пружины Config, которая содержит

<context:annotation-config /> 
<context:component-scan base-package="com.company.project" /> 
<task:annotation-driven executor="taskExecutor"/> 
<task:executor id="taskExecutor" pool-size="10" queue-capacity="10" /> 

и в некоторой части кода у меня есть

BaseClass bean = springBeans.getBean(MyClass.class); 

, но я получаю это исключение

org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'myClass' must be of type [com.company.project.MyClass], but was actually of type [$Proxy19] 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:361) 

Я могу понять его класс прокси, но не знаю, почему Spring не позволяет преобразовать прокси.

У меня есть cglib 2.2 no dep на пути к классу вместе с Spring 3.2 core libs.

Может ли кто-нибудь указать на какие-либо подсказки относительно фиксации этого?

Короче говоря, я хочу, чтобы метод был Async при вызове.

+0

Вы можете получить его из ApplicationContext через '#getBean (BaseClass.class)' или '#getBean ("MyClass")' ? Как насчет '@ Autowired' на' MyClass' где-нибудь? –

+0

Я скопировал ваш код, и он отлично работает. Я использовал «ClassPathXmlApplicationContext» для контекста. –

+0

Кроме того, присваивая переменной типа «BaseClass», вам придется отдать ее для вызова метода @ @ Async. –

ответ

2

Поскольку у вас есть CGLIB, вы можете захотеть изменить @Scope к

@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) 
+0

Кажется, что это сработало, но как только он попытался применить класс к суб-суб-подтипу, появляется другое исключение: Caused by: java.lang.ClassCastException: $ Proxy19 не может быть передан в com.company.project. AbstractClass \t в com.company.project.AbstractClass $$ FastClassByCGLIB $$ 1db1c6f.invoke () \t в org.springframework.cglib.proxy.MethodProxy.invoke (MethodProxy.java:204) \t в org.springframework. aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint (CglibAopProxy.java:698) \t at – Ben

+0

В CGLIB не должно быть такого понятия, как '$ Proxy19'. –

+0

У меня есть CGLIB 2.2 в пути класса, и есть. – Ben

 Смежные вопросы

  • Нет связанных вопросов^_^