打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
解决Spring的Component-scan和packagesToScan不支持Eclipse RCP问题
Spring 2.5开始,通过component-scan和packagesToScan设置,实现对jar包和class文件的package层级的自动扫描,从而利用Annotation实现零配置。
但在Eclipse RCP中,由于Eclipse的bundle原理,其bundle的jar包url为类似:bundleresource://269.fwk7214088/...  , 而Spring对jar和class文件的scan却只支持file的protocol,即url必须是类似:file:/F:/eclipse/....  所以在Eclipse RCP中集成SpringFramework,并在spring配置文件中使用component-scan和packagesToScan设置时,这两个配置失效,并抛出异常:
写道
2010-11-12 16:21:17,843 PathMatchingResourcePatternResolver WARN - Cannot search for matching files underneath URL [bundleresource://269.fwk7214088/com/abc/efg/] because it does not correspond to a directory in the file system
java.io.FileNotFoundException: URL [bundleresource://269.fwk7214088/com/abc/efg/] cannot be resolved to absolute file path because it does not reside in the file system: bundleresource://269.fwk7214088/com/abc/efg/
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:204)
at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:51)
at org.springframework.core.io.UrlResource.getFile(UrlResource.java:168)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.doFindPathMatchingFileResources(PathMatchingResourcePatternResolver.java:530)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.findPathMatchingResources(PathMatchingResourcePatternResolver.java:351)
at org.springframework.core.io.support.PathMatchingResourcePatternResolver.getResources(PathMatchingResourcePatternResolver.java:269)
at org.springframework.context.support.AbstractApplicationContext.getResources(AbstractApplicationContext.java:1196)
at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:204)
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:204)
at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1335)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1325)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:136)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:126)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:92)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:465)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:395)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
在网上Google无果的情况下,只好把目标放到了:
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:204)
打开org.springframework.core-sources-3.0.1.RELEASE-A中的源码包,查看ResourceUtils.java:204,发现其代码如下:
Java代码
if (!URL_PROTOCOL_FILE.equals(resourceUrl.getProtocol())) {
throw new FileNotFoundException(
description + " cannot be resolved to absolute file path " +
"because it does not reside in the file system: " + esourceUrl);
}
如果在这段代码前,可以把bundleresource类型的package转换为file类型的package,问题就可以解决。于是在这段代码前增加相关转换处理:
Java代码
//Support Eclipse RCP bundle, Modify by Alex
String protocol = resourceUrl.getProtocol();
if(protocol.equals("bundleresource") || protocol.startsWith("bundle")) {
try {
resourceUrl = org.eclipse.core.runtime.Platform.resolve(resourceUrl);
} catch(IOException e) {
e.printStackTrace();
}
}
if (!URL_PROTOCOL_FILE.equals(resourceUrl.getProtocol())) {
throw new FileNotFoundException(
description + " cannot be resolved to absolute file path " +
"because it does not reside in the file system: " + resourceUrl);
}
编译后,把ResourceUtil.class替换到spring-core.jar中就可以了。
值得注意的是,因为这里URL的转换使用了org.eclipse.core.runtime.Platform,所以spring-core.jar所在的bundle必须添加Dependencies : org.eclipse.core.runtime
当然了,因为这里的jar包是针对Eclipse 的RCP所用,所以这个应该也不是大问题
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
problems using Spring with Eclipse RCP
MyEclipse下struts2、spring、hibernate整合
org/apache/commons/pool/impl/GenericObjectPool 解决
java – SessionFactory在尝试单元测试DAO类时没有获得自动装配
J2EE在权限安装时遇到的问题
Spring实战——通过Java代码装配bean
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服