简体   繁体   English

Mybatis-Spring Java 配置@MapperScan 注解

[英]Mybatis-Spring Java Configuration @MapperScan Annotation

I am trying to set up my mybatis-spring like shown in the following examples:我正在尝试设置我的 mybatis-spring,如下例所示:

1)Code from a previous answer on stackoverflow, a few answer down ( MyBatis-Spring + @Configuration - Can't autowire mapper beans ) 1) 来自 stackoverflow 上一个答案的代码,几个答案( MyBatis-Spring + @Configuration - 不能自动装配映射器 bean

@Configuration 
@MapperScan("org.mybatis.spring.sample.mapper") 
public class AppConfig 
{   
    @Bean   
    public DataSource dataSource() 
    {     
      return new EmbeddedDatabaseBuilder().addScript("schema.sql").build();   
    }   
   @Bean   
   public DataSourceTransactionManager transactionManager() 
   {     
        return new DataSourceTransactionManager(dataSource());   
   }   
   @Bean   
   public SqlSessionFactory sqlSessionFactory() throws Exception 
   {     
       SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
       sessionFactory.setDataSource(dataSource());    
       return sessionFactory.getObject();   
   } 
}

2)Code from their documentation ( http://www.mybatis.org/spring/mappers.html ) 2)来自他们文档的代码( http://www.mybatis.org/spring/mappers.html

Usage:用法:

public class FooServiceImpl implements FooService {

  private UserMapper userMapper;

  public void setUserMapper(UserMapper userMapper) {
    this.userMapper = userMapper;
  }

  public User doSomeBusinessStuff(String userId) {
    return this.userMapper.getUser(userId);
  }
}

Registering Mapper with @MapperScan:使用@MapperScan 注册映射器:

@Configuration
@MapperScan("org.mybatis.spring.sample.mapper")
public class AppConfig {

  @Bean
  public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder().addScript("schema.sql").build()
  }

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

My code which isn't working is as shown below:我的代码不起作用,如下所示:

My Application with nested AppConfig:我的带有嵌套 AppConfig 的应用程序:

@SpringBootApplication
@MapperScan(basePackages="com.tjwhalen.game.service.dao")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    //@MapperScan(basePackages="com.tjwhalen.game.service.dao")
    public class AppConfig {

        @Autowired
        DataSource datasource;

        @Bean
        public DataSourceTransactionManager transactionManager() {
            return new DataSourceTransactionManager(datasource);
        }

        @Bean
        public SqlSessionFactory sqlSessionFactory() throws Exception {
            SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
            sqlSessionFactory.setDataSource(datasource);
            //sqlSessionFactory.setTypeAliasesPackage("com.tjwhalen.game.model");
            return (SqlSessionFactory) sqlSessionFactory.getObject();
        }

        @Bean
        public ItemSummaryDbService itemSummaryDbService() {
            return new ItemSummaryDbServiceImpl();
        }
    }
}

My service:我的服务:

public class ItemSummaryDbServiceImpl implements ItemSummaryDbService {

    @Autowired
    private ItemSummaryMapper itemSummaryMapper;

    public void setItemSummaryMapper(ItemSummaryMapper itemSummaryMapper) {
        this.itemSummaryMapper = itemSummaryMapper;
    }

    public void writeItemSummarys(List<ItemSummary> itemSummarys) {

        for(ItemSummary itemSummary : itemSummarys) {
            itemSummaryMapper.insertItemSummary(itemSummary);
        }
    }

    public List<ItemSummary> lookupItemSummarys() {
        return itemSummaryMapper.selectItemSummarys();
    }
}

My mapper in the package indicated by the @MapperScan annotaion: @MapperScan 注释指示的包中的我的映射器:

package com.tjwhalen.game.service.dao;

import java.util.List;

import com.tjwhalen.game.model.ItemSummary;

public interface ItemSummaryMapper {

    public void insertItemSummary(ItemSummary itemSummary);
    public List<ItemSummary> selectItemSummarys();
}

My usage:我的用法:

public class LoadItems implements CommandLineRunner {

    private final static Logger logger = LoggerFactory.getLogger(LoadItems.class);

    @Autowired
    private ItemSummaryDbService service;

    public void run(String... arg0) throws Exception {
        logger.info("LoadItems is running");

        ArrayList<ItemSummary> list = new ArrayList<ItemSummary>();
        list.add(new ItemSummary(1, "one", 1));
        service.writeItemSummarys(list);

    }
}

My stacktrace:我的堆栈跟踪:

java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransactionFactory.newTransaction(Ljava/sql/Connection;Z)Lorg/apache/ibatis/transaction/Transaction;
    at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:77) ~[ibatis-core-3.0.jar:na]
    at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession(DefaultSqlSessionFactory.java:40) ~[ibatis-core-3.0.jar:na]
    at org.mybatis.spring.SqlSessionUtils.getSqlSession(SqlSessionUtils.java:102) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:429) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at com.sun.proxy.$Proxy41.insert(Unknown Source) ~[na:na]
    at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:279) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:54) ~[ibatis-core-3.0.jar:na]
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:35) ~[ibatis-core-3.0.jar:na]
    at com.sun.proxy.$Proxy42.insertItemSummary(Unknown Source) ~[na:na]
    at com.tjwhalen.game.service.impl.ItemSummaryDbServiceImpl.writeItemSummarys(ItemSummaryDbServiceImpl.java:32) ~[classes/:na]
    at com.tjwhalen.game.loader.LoadItems.run(LoadItems.java:28) ~[classes/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:798) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:782) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:769) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at com.tjwhalen.game.Application.main(Application.java:37) [classes/:na]

And finally my pom.xml:最后是我的 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.tjwhalen.game</groupId>
     <artifactId>Runescape-App</artifactId>
     <version>0.0.1-SNAPSHOT</version>


    <properties>
        <java.version>1.8</java.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
    </parent>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/postgresql/postgresql -->
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>8.4-702.jdbc4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.ibatis/ibatis-core -->
        <dependency>
            <groupId>org.apache.ibatis</groupId>
            <artifactId>ibatis-core</artifactId>
            <version>3.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
        <!-- <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency> -->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.0</version>
        </dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.batch/spring-batch-infrastructure -->
<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-infrastructure</artifactId>
</dependency>




    </dependencies>



    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build> 



</project>

I've had a lot of problems in the past regarding incorrect pom.xml, so I looked at each dependency involving database access and made sure the project had the correct provided dependencies.过去我遇到了很多关于 pom.xml 不正确的问题,所以我查看了涉及数据库访问的每个依赖项,并确保项目具有正确提供的依赖项。 I also checked that the versions were the same as mentioned in the provided dependencies.我还检查了版本是否与提供的依赖项中提到的版本相同。 What does the error message AbstractMethodError indicate? AbstractMethodError错误消息表示什么?

Feel free to ask any clarifying questions随时提出任何澄清问题

I figured it out.我想到了。 I added a dependency我添加了一个依赖项

    <!-- https://mvnrepository.com/artifact/org.apache.ibatis/ibatis-core -->
    <dependency>
        <groupId>org.apache.ibatis</groupId>
        <artifactId>ibatis-core</artifactId>
        <version>3.0</version>
    </dependency>

and removing it fixed.并删除它固定。 I don't know why this dependency was here, I went through and checked the rest of my dependencies to see if they depended on ibatis-core and they didn't.我不知道为什么这个依赖在这里,我检查了我的其余依赖,看看它们是否依赖于 ibatis-core 而它们没有。

So it was an oversight on my part, and shows that AbstractMethodError is likely a dependency issue, and that is the first thing that should be checked when facing it所以这是我的疏忽,表明AbstractMethodError可能是一个依赖问题,这是在面对它时应该检查的第一件事

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM