2013-05-20 20 views
2

我有複雜的Spring項目。當我將新類:

@Service("zoneManagerDelegate") 
@Cached(keyGeneratorClass=ServiceGlobalKeyGenerator.class,dataWrapperClass=ServiceDelegateDataWrapper.class, tags = {"service", "sapi"}) 
public class ZoneManagerDelegate extends SapiDelegate<ZoneManagerWS> { 

    public ZoneManagerDelegate(){ 
     super(ZoneManagerWS.class); 
    } 

    @Cached 
    public Object[] getZones(SalesUserContext userContext) throws SalesAPIException { 
     return getWs().getZones(userContext); 
    } 
} 

和運行項目中,我遇到了一個錯誤輸出:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'conversionService' defined in ServletContext resource [/WEB-INF/context/common.xml]: Cannot resolve reference to bean 'rtChargeEntryDetailsToBookedInsertionInfo' while setting bean property 'converters' with key [14]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'rtChargeEntryDetailsToBookedInsertionInfo': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.ms.adsp.objectFinder.ObjectFinderService com.ms.adsp.bean.payment.converter.RtChargeEntryDetailsToBookedInsertionInfo.objectFinderService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'objectFinderService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.ms.adsp.objectFinder.ObjectFinderService.setObjectFinderExts(java.util.Collection); nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'objectFinderExtFactory': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'zoneManagerDelegate' must be of type [com.ms.adsp.delegate.sapi.ZoneManagerDelegate], but was actually of type [$Proxy20] 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:329) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedSet(BeanDefinitionValueResolver.java:366) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:158) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1391) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1132) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:915) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383) 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206) 
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705) 
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799) 
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779) 
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601) 
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:943) 
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:778) 
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:504) 
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317) 
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324) 
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065) 
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) 
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) 
at org.apache.catalina.core.StandardService.start(StandardService.java:525) 
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754) 
at org.apache.catalina.startup.Catalina.start(Catalina.java:595) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) 
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 

用法看起來是這樣的:

@Component 
public class ObjectFinderExtFactory { 

    @Resource(name="zoneManagerDelegate") 
    private ZoneManagerDelegate zoneManagerDelegate; 

... 

}

當我刪除ZoneManagerDelegate中的@Cached註釋時 - 它正在工作精細。所有其他擴展SapiDelegate的代表 - 也能正常工作。

其他信息:

public abstract class SapiDelegate<T> implements ApplicationListener<EnvironmentReloaded> { 

private static final Logger logger = Logger.getLogger(SapiDelegate.class); 

private T wsInstance; 

private final Class<T> wsClass; 

public SapiDelegate(Class<T> wsClass){ 
    this.wsClass = wsClass; 
} 

@Override 
public synchronized void onApplicationEvent(EnvironmentReloaded appReloaded) { 
    wsInstance = null; 
    logger.debug("Sales API client invalidated: " + wsClass.getName()); 
} 

/** 
* Returns webservice client object 
*/ 
protected synchronized T getWs() { 
    try { 
     if (wsInstance == null) { 
      wsInstance = ClientFactory.createClient(wsClass, "adsalespro"); 
      logger.debug("Sales API client created: " + wsClass.getName()); 
     } 
     return (T) wsInstance; 
    } catch (Exception e) { 
     throw new SapiException(e); 
    } 
} 

}

版本:
春3.2.0
的apache-tomcat的-6.0.36

任何想法?謝謝。

+0

你可以給@Cached類的全名? –

回答

4

對我來說,似乎問題在於,你不是針對接口編程

嘗試定義這樣的接口:

public interface ZoneManagerDelegateInterface { 

    public Object[] getZones(SalesUserContext userContext) throws SalesAPIException 
} 

,並與您的ZoneManagerDelegate實現它。
然後使用它參照它的界面:

@Component 
public class ObjectFinderExtFactory { 

    @Resource(name="zoneManagerDelegate") 
    private ZoneManagerDelegateInterface zoneManagerDelegate; 

... 

UPDATE

使用CGLIB代理而不是JDK動態代理另一種解決方案。這可以強制在Spring configuration。請注意,你需要在你的類路徑上使用CGLIB(自Spring 3.2.0以來不是這樣)。

這裏是有趣comparison of CGLIB proxies and JDK Dynamic proxies

+0

Thx,在我的情況下工作。 – mrKraft

0

如果你使用註解驅動的應用程序上下文,註解你@Configuration類

@EnableAspectJAutoProxy(proxyTargetClass = true) 

您還可以添加以下的依賴:

<dependency> 
<groupId>org.aspectj</groupId> 
<artifactId>aspectjweaver</artifactId> 
<version>1.7.2</version> 
</dependency> 
0

在我的課堂上實現接口解決了這個問題。

public interface UserInterface { 
    public void saveDetails(); 
} 

實現你要使用它的類上面的界面,

public class UserInterfaceImpl implements UserInterface{ 
    //your implementation stuff goes here 
} 
相關問題