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