Java Spring和MyBatis无法通过MapperScannerConfigure在.jar内的接口找到bean
我正在使用Java Spring和MyBatis无法通过MapperScannerConfigure在.jar内的接口找到bean,java,spring,spring-mvc,mybatis,spring-mybatis,Java,Spring,Spring Mvc,Mybatis,Spring Mybatis,我正在使用Spring 3.2.0在一个旧式项目中使用Mybatis 3.3.0和Mybatis Spring 1.2.3. 我有几个项目使用这种技术,他们需要将类似的新代码添加到一个库中,使我能够与外部系统交互,在交互过程中,我需要在这个新代码中调用数据库中的几个方法 我创建了一个接口并将其放入一个包中,比如: com.mycompany.myapp.dao.MyNewService 该接口有几个方法。所有这些都是在同一个包路径中的Mybatismapper文件MyNewService.xm
Spring 3.2.0
在一个旧式项目中使用Mybatis 3.3.0
和Mybatis Spring 1.2.3.
我有几个项目使用这种技术,他们需要将类似的新代码添加到一个库中,使我能够与外部系统交互,在交互过程中,我需要在这个新代码中调用数据库中的几个方法
我创建了一个接口并将其放入一个包中,比如:
com.mycompany.myapp.dao.MyNewService
该接口有几个方法。所有这些都是在同一个包路径中的Mybatis
mapper文件MyNewService.xml
中定义的
我创建了一个包含所有这些代码的.jar文件
在我的主应用程序中,我向这个.jar文件添加了一个依赖项,它最终位于WEB-INF\lib\MyHelpers.jar
在该应用程序中,我有一个根应用程序上下文spring文件,我尝试使用mybatis MapperScannerConfigure
通过以下方式查找此新bean/服务:
<!--scan for mappers and let them be autowired -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mycompany.myapp.dao" />
<property name="sqlSessionFactoryBeanName"
value="sqlSessionFactory" />
</bean>
随后,代码在依赖项注入过程中失败,出现了大量stacktrace,其实质是:
2017-03-08 15:38:39625[[ACTIVE]ExecuteThread:“0”用于队列:
“weblogic.kernel.Default(自调整)”错误
(org.springframework.web.servlet.DispatcherServlet:466)-上下文
初始化失败
org.springframework.beans.factory.BeanCreationException:错误
创建名为“orderDetailsController”的bean:注入
自动连线依赖失败;嵌套异常是
org.springframework.beans.factory.BeanCreationException:无法
autowire字段:private com.mycompany.myapp.dao.MyNewService
com.mycompany.otherapp.controller.OrderDetailsController.myNewService
; 嵌套异常是
org.springframework.beans.factory.noSuchBean定义异常:否
找到类型为[com.mycompany.myapp.dao.MyNewService]的匹配bean
对于依赖项:至少需要1个符合autowire条件的bean
此依赖项的候选项。依赖项批注:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}
如果我深入研究Mybatis代码,当它使用某个ResourceResolver代码时,它根本无法从该.jar中的包路径中找到资源。如果我直接将代码移动到项目中,而不是添加.jar依赖项,那么代码可以正常工作,不会出错
当然,我需要考虑的是,我必须在六个项目中使用相同的代码,所以我想我应该将它放在这个.jar文件中,并使用MapperScannerConfigure
。我们在所有项目中都使用它,但所有的.xml都在应用程序WEB-INF\classes
中。部署时,它不在WEB-INF\lib
中的.jar文件中
有没有办法做到这一点?总之,它类似于:
Mybatis
接口和.xml映射器文件创建名为Model.jar
的文件WEB-INF\lib
如果您需要更多的说明,我当然可以补充。您的问题似乎是MyHelpers.jar不是类路径的一部分。这是一个配置问题。如果您使用的是maven,那么只需将此jar作为依赖项添加,如果不是,您需要通过将此jar添加到类路径来手动修复它。MyHelpers.jar位于WEB-INF\lib中,但Spring资源读取器似乎无法从内部读取定义。如果它在WEB-INF\类中,则工作正常。如果我不使用MapperScannerConfigure并创建一个实现类来实现接口并扩展SqlSessionDaoSupport,那么配置Spring将sqlsession注入其中,它就可以正常工作。只是MapperScannerConfigure似乎没有看到它。我还认为jar内容在运行时不在类路径中,即使它可能在编译时,在IDE中。在构建时检查它是否良好导出,并在部署的战争中显示在适当的位置。您可以更简单地通过引用JAR提供的类进行验证,并期望ClassNotFoundException。这是一个遗留项目,可能不使用Maven或任何可以处理此依赖性问题的构建工具?作为一个测试,a创建了一个junit测试类,并将部分代码移动到另一个项目。我使主要项目依赖于该项目的产出。当它运行时,它有一个-classpath“c:\dev\projects\MyProject\classes;…”,并且运行良好。然后我修改了它,使其取决于第二个项目的JAR输出,即C:\dev\projects\MyProject\deploy\MyLibrary.JAR,但它没有运行。ClassPathMapper扫描程序报告:“在“[包路径]中未找到MyBatis映射程序”'然后,由于无法找到用于测试的@Autowire bean,引发了NoSuchBeanDefinitionException。您的问题似乎是MyHelpers.jar不是类路径的一部分。这是一个配置问题。如果您使用的是maven,则只需将此jar作为依赖项添加,如果不是,则需要通过将此jar添加到cla来手动修复它sspath.MyHelpers.jar位于WEB-INF\lib中,但Spring资源读取器似乎无法从其中读取定义。如果它位于WEB-INF\classes中,则工作正常。如果我不使用MapperScannerConfigure并创建实现接口并扩展SqlSessionDaoSupport的实现类,则将Spring配置为注入sqlsession,它工作得很好。只是MapperScannerConfigure似乎看不到它。我还认为jar内容在运行时不在类路径中,即使它可能在编译时,在IDE中。请检查它在构建时是否导出良好,在部署的WAR中的适当位置。您可以通过引用进行更简单的验证g是JAR提供的类,期望ClassNotFoundException。它是遗留项目,可能不使用Maven或任何可以处理
WARN (ClassPathMapperScanner.java:167) - No MyBatis mapper was
found in '[com.mycompany.myapp.dao]' package.
Please check your configuration.