2015-04-05 4 views
0

Я создал простую программу 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? В качестве альтернативы, кто-нибудь может предложить что-нибудь, что я могу сделать, чтобы еще больше исследовать проблему?

ответ

0

Я столкнулся с тем же вопросом при попытке реализовать mybatis-CDI, работающий в Jboss wildfly. Я нашел решение при переходе через этот мерзавец smaple проект: https://github.com/artplastika/mybatis-cdi-example

Единственного, что вы, кажется, хватают только @LOCAL, @Stateless и @Named аннотаций на вашем SqlSessionFactoryProvider.java классе

См SqlSessionFactoryProvider. Java класс в примере Git: https://github.com/artplastika/mybatis-cdi-example/blob/master/mybatis-cdi-example-ejb/src/main/java/org/mybatis/cdi/example/beans/SqlSessionFactoryProviderImpl.java

вы также должны убедиться, что у вас есть beans.xml в вас SRC/главная/ресурсы/META-INF папку

EDIT

My Maven зависимостей настройки:

<dependencies> 
     <dependency> 
      <groupId>javax</groupId> 
      <artifactId>javaee-api</artifactId> 
      <version>7.0</version> 
      <scope>compile</scope> 
     </dependency> 
     <!-- Import the CDI API --> 
     <dependency> 
      <groupId>javax.enterprise</groupId> 
      <artifactId>cdi-api</artifactId> 
      <version>1.2</version> 
      <scope>compile</scope> 
     </dependency> 
     <!-- Mybatis Dependencies --> 
     <dependency> 
      <groupId>org.mybatis</groupId> 
      <artifactId>mybatis</artifactId> 
      <version>3.2.5</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.mybatis</groupId> 
      <artifactId>mybatis-cdi</artifactId> 
      <version>1.0.0-beta1</version> 
      <scope>compile</scope> 
     </dependency> 
     <!-- Below Dependencies are very specific to Jboss due to class conflicts if you dont have the exclusions specified --> 
     <!-- Proxy support (Mandatory) --> 
     <dependency> 
      <groupId>cglib</groupId> 
      <artifactId>cglib</artifactId> 
      <scope>compile</scope> 
      <version>2.2.2</version> 
      <exclusions> 
       <exclusion> 
        <groupId>asm</groupId> 
        <artifactId>asm</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <!-- Internal dependency (Required) --> 
     <dependency> 
      <groupId>org.ow2.asm</groupId> 
      <artifactId>asm-util</artifactId> 
      <version>5.0.3</version> 
      <scope>compile</scope> 
      <exclusions> 
       <exclusion> 
        <groupId>org.ow2.asm</groupId> 
        <artifactId>asm</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <!-- Internal dependency (Required) --> 
     <dependency> 
      <groupId>opensymphony</groupId> 
      <artifactId>oscache</artifactId> 
      <version>2.4</version> 
      <scope>compile</scope> 
      <!-- This excludes the transitive dependency on JMS --> 
      <exclusions> 
       <exclusion> 
        <groupId>javax.jms</groupId> 
        <artifactId>jms</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 

Я получил мой образец фабрики Producer, как показано ниже:

@Stateless 
@Local(SampleSqlSessionFactoryProvider.class) 
public class SampleSqlSessionFactoryProvider { 
    @Produces 
    @ApplicationScoped 
    @Named("sqlSessionFactory") 
    public SqlSessionFactory produceFactory() throws Exception {   
     Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); 
     SqlSessionFactory sqlSessionFactory = null; 
     String environment = "default"; 
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, environment); 
     return sqlSessionFactory; 
    } 
} 

и использовать его я впрыснуть его следующим образом:

@Local(DaoBean.class) 
@Stateless 
public class DoaBean{ 
    private @Inject @Named("sqlSessionFactory") SqlSession session; 
    public void doStuff(){ 
     session.selectOne(...); 
    } 
    ... 
} 
+0

Я просто попытался добавить аннотации '@ Local',' @ Stateless' и '@ Named ', но я все еще получаю' MybatisCdiConfigurationException'. Какую версию GlassFish и Weld вы используете? –

+0

Я использую JBoss Wildfly (8.2). Если вы все еще получаете эту ошибку, возможно, это связано с тем, как вы пытаетесь внедрить 'org.apache.ibatis.session.SqlSession'. В качестве альтернативы это может быть какая-то перестановка проблемы класса. Является ли ваш проект maven? –

+0

Что кажется странным, так это то, что я могу сделать '@Inject private SqlSession sqlSession;', а компонент SqlSession вводится нормально, и я запускаю запросы с помощью MyBatis. Проблема возникает только в том, что я пытаюсь ввести компонент «Mapper». Например, выполнение '@Inject @Mapper private ToDoItemMapper toDoItemMapper;' вызывает исключение 'MybatisCdiConfigurationException', потому что' CDIUtils.findSqlSessionFactory (...) 'не может найти фабричный метод, который возвращает' SqlSessionFactory', –

0

Я нашел обходное решение этой проблемы, но на самом деле решение, на которое я надеялся. Я скопировал различные классы, которые составляют mybatis-cdi непосредственно в мою программу, и зарегистрировал расширение в META-INF/services/javax.enterprise.inject.spi.Extension, и теперь я могу успешно внедрить в программу свою программу и запускать запросы с помощью MyBatis.

Я подменил это как issue в репозитории MyBatis-CDI GitHub и обновит этот ответ, если есть исправление.