我有以下类,但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
答案 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);
但是我不喜欢它!