【发布时间】:2015-04-05 17:44:09
【问题描述】:
我创建了一个简单的 Java EE 程序来试验 MyBatis,但我在使用 MyBatis CDI 模块时遇到了问题。我已按照http://mybatis.github.io/cdi/injection.html 中概述的说明进行操作,但是当我的程序尝试使用 MyBatis 时,会引发 MybatisCdiConfigurationException 异常,描述为“没有正确配置 SqlSessionFactory 生产者。”
我正在使用的 SqlSessionFactory 的代码如下:
import javax.annotation.Resource;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import javax.sql.DataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
public class SqlSessionFactoryProvider {
@Resource (name="jdbc/MyDatabase")
DataSource dataSource;
@Produces
@ApplicationScoped
public SqlSessionFactory produceFactory() {
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development",
transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(ToDoItemMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(configuration);
return sqlSessionFactory;
}
}
我单步调试了 MyBatis CDI 模块的代码,发现当执行CDIUtils findSqlSessionFactory(...) 中的以下代码行时,它无法找到任何返回SqlSessionFactory.class. 的bean
beans = beanManager.getBeans(SqlSessionFactory.class, qualifiers.toArray(new Annotation[]{}));
我尝试在 GlassFish 4 和 4.1 上运行我的程序,它们都有同样的问题,但如果我在 WildFly 8.1 上运行我的程序,它就可以工作。我的第一个想法是 Glassfish 随附的 Weld 版本可能存在问题,但事实证明 GlassFish 4.1 运行的是 Weld 版本 2.2.2,而 WildFly 运行的是 Weld 版本 2.1.2。
当在 GlassFish 中运行时,我可以在 GlassFish、我的代码或 MyBatis CDI 模块中做些什么来克服这个问题?或者,任何人都可以建议我可以做些什么来进一步调查这个问题吗?
【问题讨论】:
标签: java glassfish cdi mybatis weld