【问题标题】:Spring importing extending and implementing class from a projectSpring从项目中导入扩展和实现类
【发布时间】:2014-09-17 20:59:52
【问题描述】:

我有两个(网络)项目,第二个项目使用第一个扩展类。我什至不知道我的项目的设计是否正确,但事实是我在服务器启动期间遇到了错误,我不知道是否存在设计错误:

- 项目鸟

package com.mycompany.dao;

public interface BirdDao{
     public void saveFly(Fly fly);
}

package com.mycompany.dao.impl;

public class BirdDaoImpl implements BirdDao{
   public BirdDaoImpl(){
   }
   public void saveFly(Fly fly){
       System.out.println("I'm saving flight data...");
   }
}

- 猎鹰计划

package com.mycompany.myunit.dao;

public interface FalconDao {
  public void saveHunt(Hunt hunt);
}

package com.mycompany.myunit.dao.impl;

import com.mycompany.dao.impl.BirdDaoImpl;

public class FalconDaoImpl extends BirdDaoImpl implements FalconDao{
  public FalconDaoImpl(){
  }

  public void saveHunt(Hunt hunt){
     System.out.println("I'm saving hunt data... poor prey!");
  }
}

当我尝试在服务器上运行此架构时,Spring 引发异常:

平台:Eclipse Luna 4.4 Spring工具套件3.6.1

Severe: Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to load bean class: com.mycompany.myunit.dao.impl.FalconDaoImpl; nested exception is java.io.FileNotFoundException: class path resource [com/mycompany/dao/impl/BirdDaoImpl.class] cannot be opened because it does not exist
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:162)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:305)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:254)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:94)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:609)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:241)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1206)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1026)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4421)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4734)
    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.deployDirectory(HostConfig.java:1079)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1002)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:506)
    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:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.io.FileNotFoundException: class path resource [com/mycompany/dao/impl/BirdDaoImpl.class] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:50)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:82)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:77)
    at org.springframework.context.annotation.ConfigurationClassParser.asSourceClass(ConfigurationClassParser.java:564)
    at org.springframework.context.annotation.ConfigurationClassParser$SourceClass.getSuperClass(ConfigurationClassParser.java:740)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:287)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:218)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:176)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:158)
    ... 39 more

是否存在设计错误或 Eclipse 上的配置错误?

  • ProjectBird 已在 POM 中列出
  • 在设计时 Eclipse 上没有错误或问题

谢谢!

【问题讨论】:

  • ProjectBird 是如何打包的?您是否在 ProjectFalcon 依赖项列表中看到了相应的依赖项?
  • @m4rtin,它被打包为一个 jar,因为我已经将它作为一个 maven 工件安装在我的 .m2 存储库中。它出现在 Maven 的依赖项下,不是作为一个 jar,而是作为一个项目。
  • 如果将其打包为 JAR,我认为将 ProjectFalcon 的这种依赖项包含为 JAR 而不是项目会更干净。我可能是错的,但是将它作为 Project 的问题是您必须确保正确附加了源,而鉴于您的 FileNotFoundException. 似乎并非如此
  • @m4rtin,实际上我已经通过 Maven 从 ProjectBird 创建了一个 jar,并将其作为依赖项导入到 ProjectFalcon 的 POM 文件中:com.mycompany project-bird1.0.0-SNAPSHOT -->
  • 好吧,我认为它应该可以工作,而且由于它是作为 JAR 导入的,因此您绝对可以删除 ProjectFalcon 中的 ProjectBird Project 依赖项。您是手动导入 ProjectBird JAR 还是将其发布到本地 maven repo 并让 maven 将其导入 ProjectFalcon 的依赖项?如果是后者,恐怕我不知道:|

标签: java eclipse spring maven spring-mvc


【解决方案1】:

其实这个设计不会很好用……

如果你在某些配置中没有指明项目之间的依赖关系,它是行不通的,即使这样,在两个 web 项目之间建立依赖关系听起来也不好..

如果您需要重用一个类或扩展其他项目使用的一个类,此方案非常适合将该类/类作为依赖项封装到一个 jar 中,并在两个项目中导入该唯一依赖项。

更清楚的例子是当你有服务层和web层时,我们可以将web层(http控制器和视图)放在一个项目中,将服务层(服务接口和实现)放在另一个项目中,并建立一个web项目和服务项目之间的依赖关系,可以通过将jar作为依赖导入到web项目中来完成,或者如果我们使用maven,可以将其声明为依赖。

【讨论】:

  • 在更早的时候,ProjectBird 被用作一个罐子。它不是作为 Web 项目运行的。但我很欣赏你的建议,也许我打算将项目拆分为一个服务和两个网络项目。但是您的回答没有提到 Spring 不定位类 BirdDaoImpl 的动机。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-04-21
  • 2012-10-25
  • 2011-11-24
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多