Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring和MyBatis无法通过MapperScannerConfigure在.jar内的接口找到bean_Java_Spring_Spring Mvc_Mybatis_Spring Mybatis - Fatal编程技术网

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
  • 使用上面的语法配置主spring applicationContext文件

  • 如果您需要更多的说明,我当然可以补充。

    您的问题似乎是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.