gpt4 book ai didi

java - Autowiring Spring 3.1 独立应用程序返回 "No unique bean of type [x.x.x.x] is defined"异常

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:45 24 4
gpt4 key购买 nike

我正在编写一个独立的应用程序(不是基于网络的),它将使用以下命令从命令提示符运行:

java -jar myapplication.jar 

我在 Eclipse 上将应用程序开发为 Maven 项目,以便 Eclipse 检索所有依赖库。如果我右键单击主类并选择“运行方式”>“Java 应用程序”,它就可以正常工作。

现在我遇到的问题是我需要将应用程序部署为单个 jar 文件。为此,我使用 Eclipse 将应用程序导出为“可运行 Jar”(即通过“导出命令”)。这生成了 jar 文件。我查看了jar文件,所有的类和依赖的jar文件都在jar文件中。Spring 应用程序上下文文件也位于顶级文件夹的 jar 文件中。 jar 文件的“内部”如下所示:

- com
- myapp
- service
- MyAppService.class
- dao
- MyAppDataDao.class
- MyMainClass.class


- META-INF
- org
- application-context-components.xml
- log4j.properties
- [several jar files for spring, log4j, velocity etc)

我尝试使用以下命令运行 jar 文件,但它给了我这个错误:

Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.myapp.MyMainClass] is defined: expected single bean but found 0:
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:257)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1012)
at com.myapp.MyMainClass.init(MyMainClass.java:44)
at com.myapp.MyMainClass.main(MyMainClass.java:65)
... 5 more

文件 com.myapp.MyMainClass 位于具有正确名称的 jar 文件中。包中的类是 Autowiring 的。我认为我一定错过了注释中的某些内容或者应用程序上下文文件中的某些内容。类的结构和使用的注释如下所示:

MyMainClass

@Component
public class MyMainClass{

@Autowired
MyAppService myAppService;

public static void main(String args[]){
try{
context = new ClassPathXmlApplicationContext(properties.get("app.context"));

MyMainClass mymainClass = context.getBean(MyMainClass.class);
mymainClass.myAppService.getData()....
....
}catch(Exception e){
throw new CWAException(fname + ":" + e);
}
}
}

app.context 属性返回应用程序上下文文件的名称。

我的应用服务

@Service
public class MyAppService{

@Autowired
MyAppDataDao myAppDataDao;

---
---
---
}

MyAppDataDao

@Repository("myAppDataDao;")
public class MyAppDataDao {

getData(){
}

---
---
---
}

应用程序上下文文件如下所示

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!-- Auto scan the components -->
<context:component-scan base-package="com.myapp" />

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean"
p:resourceLoaderPath="file://C:\template"
p:preferFileSystemAccess="true"/>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
<property name="url"><value>jdbc:oracle:thin:@x.x.x.x:x</value></property>
<property name="username"><value>xxx</value></property>
<property name="password"><value>xxx</value></property>
</bean>
</beans>

查看错误,我猜测 Autowiring 没有启动,但我无法弄清楚配置中的哪里出错了。该应用程序位于打包的 jar 文件中,我正在使用 ClassPathXmlApplicationContext 加载该文件,因此它应该可以找到它。我也不明白为什么它在 Eclipse 上有效,但在导出后却不起作用。

有什么想法吗?

最佳答案

Spring3.0中的PathMatchingResourcePatternResolver类至少不会搜索jar中带有 Autowiring 注释的类。

将 jar 所在的目录添加到类路径中。

它将检测类并作为 bean 加载。

关于java - Autowiring Spring 3.1 独立应用程序返回 "No unique bean of type [x.x.x.x] is defined"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12763678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com