为什么我的Spring Boot @Autowired MyBatis静态映射器为空?

时间:2018-05-11 00:38:34

标签: java spring spring-boot spring-mybatis

我有以下类,但Spring和MyBatis-Spring-Boot-Starter不会自动装配我的映射器。

当我运行请求时,我从println()

获得输出
sourceMapper = null

模型

public class Source {       
    @Autowired
    public static SourceMapper sourceMapper;   #### Why isn't this set?

    public static Source findOrCreate(String url) {
        ...
        System.out.println("sourceMapper = " + sourceMapper);
        source = sourceMapper.findByHost(host);
        ...
    }

}

我尽可能地遵循了这些例子。

http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

处理请求的主@Autowired类中的其他Mappers @Controller工作,即使它们是私有的。

这是Mapper类

package ...mapper;

@Mapper
public interface SourceMapper {
  ...

我再次使用新模型和映射器遇到了这个问题。我尝试关注Why is my Spring @Autowired field null?the code sample,但 null!我尝试了@Configurable@Service@Component

Model
@Configurable
public class Domain {
    @Autowired
    private static DomainMapper domainMapper;

    public static void incrementCounter(String host) {
        ...
        Domain d = getDomainMapper().find(host, thisMonth);

    public static DomainMapper getDomainMapper() {
        return domainMapper;

    public static void setDomainMapper(DomainMapper domainMapper) {
        Domain.domainMapper = domainMapper;
Mapper
@Mapper
public interface DomainMapper {

MyBatis 3.4.5,MyBatis Spring 1.3.1,MyBatis Spring Boot Autoconfigure 1.3.1,MyBatis Spring Boot Starter 1.3.1

2 个答案:

答案 0 :(得分:0)

如果另一个bean需要它,Spring将只尝试为你注入一个bean。

你的班级Source只是一个普通的类,有很多静态方法。

因此,它不受Spring的创造控制。

如果您要向SourceMapper注入Source,则应将Source标记为@Component@Service,以便容器知道它应该创建一个Source类型的bean,为您提供SourceMapper的实例。

此外,SourceMapper应声明为非静态,以防止类在注入之前访问变量。只有在使用字段设置器注入时才能注入静态字段。

答案 1 :(得分:0)

我用

修复了它
private static DomainMapper getDomainMapper() {
    // https://stackoverflow.com/a/52997701/148844
    if (domainMapper == null)
        domainMapper = MyApplication.getApplicationContext().getBean(DomainMapper.class);
    return domainMapper;

还有

MyApplication
@Autowired // for AWS
private static ApplicationContext context;
// I believe this only runs during an embedded Tomcat with `mvn spring-boot:run`. 
// I don't believe it runs when deploying to Tomcat on AWS.
public static void main(String[] args) {
    context = SpringApplication.run(MyApplication.class, args);

但是我不喜欢它!