Java 在服务中调用DAO时AbstractMethodError和null映射器

Java 在服务中调用DAO时AbstractMethodError和null映射器,java,spring-boot,mybatis,spring-mybatis,mybatis-generator,Java,Spring Boot,Mybatis,Spring Mybatis,Mybatis Generator,我正在用Spring boot、Mybatis(Spring和generator)构建一个独立的应用程序,我想我配置的一切都很好,但autowired mapper为null,调用它时会出现AbstractMethodError 实际上我认为这是因为空映射器。我一直在寻找它,我遵循每一个可能的解决方案,但没有任何效果 关于代码:我也在使用JavaFX,但这对我的问题没有任何影响 my.project.core.Main.java @SpringBootApplication @MapperSca

我正在用Spring boot、Mybatis(Spring和generator)构建一个独立的应用程序,我想我配置的一切都很好,但autowired mapper为null,调用它时会出现AbstractMethodError

实际上我认为这是因为空映射器。我一直在寻找它,我遵循每一个可能的解决方案,但没有任何效果

关于代码:我也在使用JavaFX,但这对我的问题没有任何影响

my.project.core.Main.java

@SpringBootApplication
@MapperScan({"my.project.persistence"})
public class Main extends Application{

    private ConfigurableApplicationContext springContext;

    public static void main(String[] args){
        launch(args);
    }

    public void start(Stage stage) throws Exception {

        springContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);

        //Some code to display the views

        System.out.println("test 1: " + springContext.getBean(UsuarioMapper.class));

        stage.show();
    }
}
(使用MyBatis生成器生成DAO) my.project.persistence.UsuarioMapper.java

@Mapper //I've also tried @Component
public interface UsuarioMapper {

    int countByExample(UsuarioExample example);

    int deleteByExample(UsuarioExample example);

    int deleteByPrimaryKey(String codUsuario);

    int insert(UsuarioBean record);

    //Etc etc etc
}

(服务)my.project.services.ServicioUsuario.java

@Service
public class ServicioUsuario {

    @Autowired private UsuarioMapper usuarioMapper;

    public boolean userExists(String user){

        System.out.println("test 2: " + usuarioMapper);
        UsuarioBean bean = usuarioMapper.selectByPrimaryKey(user);
        return bean!=null;
    }

}
(Config)my.project.Config.SpringConfiguration.java

@Configuration
public class SpringConfiguration {

    /*========== SERVICES ==========*/

    @Bean 
    public ServicioUsuario servicioUsuario() throws Exception{
        return new ServicioUsuario();
    }

    /*========== DAO ==========*/

    //I've already tried passing userMapper().getObject() in ServicioUsuario
    //constructor, but the output is the same, null mapper
    @Bean
    public MapperFactoryBean<UsuarioMapper> userMapper() throws Exception {
        MapperFactoryBean<UsuarioMapper> factoryBean = new MapperFactoryBean<UsuarioMapper>(UsuarioMapper.class);
        factoryBean.setSqlSessionFactory(sqlSessionFactory());
        return factoryBean;

    /*========== CONNECTION ==========*/

    @Bean
    public DataSource dataSource() throws ClassNotFoundException, SQLException{
        OracleDataSource dataSource = new OracleDataSource();

        dataSource.setDriverType("thin");
        dataSource.setServerName("localhost");
        dataSource.setDatabaseName("xe");
        dataSource.setPortNumber(1521);
        dataSource.setUser("testuser");
        dataSource.setPassword("pass123");

        Class.forName("oracle.jdbc.driver.OracleDriver");

        return dataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource());
        SqlSessionFactory sqlSessionFactory = factoryBean.getObject();
        return sqlSessionFactory;
    }

    @Bean
    public DataSourceTransactionManager transactionManager() throws ClassNotFoundException, SQLException {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean
    public SqlSessionTemplate sqlSession() throws Exception {
          return new SqlSessionTemplate(sqlSessionFactory());
        }

}

我应该实现MyBatis生成器生成的映射器接口吗?我有配置错误的bean吗?我尝试了所有方法,但映射程序只想保持为空。谢谢。

stacktrace清楚地显示映射器已注入,且不为空:

    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:35)
    at com.sun.proxy.$Proxy15.selectByPrimaryKey(Unknown Source)
    at my.project.services.ServicioUsuario.userExists(ServicioUsuario.java:42)
这些行显示映射器的调用确实发生,并且它不是
null

发生此错误的原因是mybatis和spring之间的版本不兼容mybatis和spring

您需要检查这些库的实际使用版本(maven和gradle的实际使用方式不同),并确保它们都兼容。您可以使用来检查这个

例如,从本页我可以看到
mybatis-spring
version
2.0.3
使用
spring
version
5.1.10。发布
mybatis
版本
3.5.3
。然后将其与构建工具(mvn或gradle)解析的实际依赖关系版本进行比较

对于gradle来说,这是通过任务完成的


对于maven,请使用插件。

Eh。。。嗯,我在编辑我的问题以添加pom.xml,因为我没有发现版本不兼容,但后来我发现我的持久性项目的pom(我在不同的项目中拥有所有内容)没有spring,它被配置为一个通用的maven项目。现在它工作正常,映射器从不为空。无论如何,我认为你的回答是正确的,它帮助我解决了我的问题,非常感谢!
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:35)
    at com.sun.proxy.$Proxy15.selectByPrimaryKey(Unknown Source)
    at my.project.services.ServicioUsuario.userExists(ServicioUsuario.java:42)