Почему мой Spring Boot @Autowired MyBatis статический маппер нулевой? - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующий класс, но 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 {
  ...

Я снова столкнулся с этой проблемой с новой моделью и картографом. Я пытался следовать Почему мое поле Spring @Autowired имеет значение null? и пример кода , но оно было все еще 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 голосов
/ 25 октября 2018

Я исправил это с помощью

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);

Но мне это не нравится!

0 голосов
/ 11 мая 2018

Spring будет пытаться ввести для вас боб, только если этого требует другой бин.

Ваш класс Source - это обычный класс со множеством статических методов.

Следовательно, он не находится под контролем создания Spring.

Если вы хотите внедрить SourceMapper в Source, вы должны пометить Source с помощью @Component или @Service, чтобы контейнер знал, что он должен создать бин типа Source для вас и дать вам экземпляр SourceMapper.

Более того, SourceMapper должен быть объявлен нестатическим, чтобы предотвратить доступ класса к переменной до внедрения. А статическое поле может быть введено только в том случае, если оно использует метод установки поля.

...