Я создал простую программу Java EE для экспериментов с MyBatis, но я столкнулся с проблемой, используя модуль CDI MyBatis. Я следовал инструкциям, указанным на http://mybatis.github.io/cdi/injection.html, но когда моя программа пытается использовать MyBatis, исключение MybatisCdiConfigurationException
выбрано с описанием «Нет правильно настроенных производителей SqlSessionFactory».MyBatis CDI beanManager.getBeans не может найти компонент SqlSessionFactory в GlassFish 4 и 4.1
Код для 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.
beans = beanManager.getBeans(SqlSessionFactory.class, qualifiers.toArray(new Annotation[]{}));
Я попытался запустить мою программу на GlassFish 4 и 4.1 и оба они имеют те же проблемы, но это работает найти, если я бегу моя программа на WildFly 8.1. Моя первая мысль заключалась в том, что это может быть проблемой с версией Weld, поставляемой с Glassfish, но выясняется, что GlassFish 4.1 работает с версией Weld 2.2.2, тогда как WildFly работает с версией Weld версии 2.1.2.
Есть ли что-нибудь, что я могу сделать в GlassFish, моем коде или в модуле CDI MyBatis для решения этой проблемы при работе в GlassFish? В качестве альтернативы, кто-нибудь может предложить что-нибудь, что я могу сделать, чтобы еще больше исследовать проблему?
Я просто попытался добавить аннотации '@ Local',' @ Stateless' и '@ Named ', но я все еще получаю' MybatisCdiConfigurationException'. Какую версию GlassFish и Weld вы используете? –
Я использую JBoss Wildfly (8.2). Если вы все еще получаете эту ошибку, возможно, это связано с тем, как вы пытаетесь внедрить 'org.apache.ibatis.session.SqlSession'. В качестве альтернативы это может быть какая-то перестановка проблемы класса. Является ли ваш проект maven? –
Что кажется странным, так это то, что я могу сделать '@Inject private SqlSession sqlSession;', а компонент SqlSession вводится нормально, и я запускаю запросы с помощью MyBatis. Проблема возникает только в том, что я пытаюсь ввести компонент «Mapper». Например, выполнение '@Inject @Mapper private ToDoItemMapper toDoItemMapper;' вызывает исключение 'MybatisCdiConfigurationException', потому что' CDIUtils.findSqlSessionFactory (...) 'не может найти фабричный метод, который возвращает' SqlSessionFactory', –