Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MyBatis CDI beanManager.getBeans在GlassFish 4和4.1中找不到SqlSessionFactory bean_Java_Glassfish_Cdi_Mybatis_Weld - Fatal编程技术网

Java MyBatis CDI beanManager.getBeans在GlassFish 4和4.1中找不到SqlSessionFactory bean

Java MyBatis CDI beanManager.getBeans在GlassFish 4和4.1中找不到SqlSessionFactory bean,java,glassfish,cdi,mybatis,weld,Java,Glassfish,Cdi,Mybatis,Weld,我创建了一个简单的JavaEE程序来试验MyBatis,但在使用MyBatisCDI模块时遇到了一个问题。我已经按照上概述的说明进行了操作,但是当我的程序尝试使用MyBatis时,会引发MybatisCdiConfigurationException异常,其说明中没有正确配置的SqlSessionFactory生产者 我正在使用的SqlSessionFactory的代码如下: import javax.annotation.Resource; import javax.enterprise.co

我创建了一个简单的JavaEE程序来试验MyBatis,但在使用MyBatisCDI模块时遇到了一个问题。我已经按照上概述的说明进行了操作,但是当我的程序尝试使用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.getBeansSqlSessionFactory.class,qualifiers.toArraynew注释[]{}

我试过在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模块中做些什么来克服这个问题?或者,有人能建议我做些什么来进一步调查这个问题吗?

我在Jboss wildfly中运行mybatis CDI时遇到了同样的问题。我在完成这个git smaple项目时找到了解决方案:

您似乎唯一缺少的是SqlSessionFactoryProvider.java类上的@Local、@Stateless和@Named注释

请参见Git示例中的SqlSessionFactoryProvider.java类:

您还应该确保在src/main/resources/META-INF文件夹中有beans.xml

编辑

我的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>
为了使用它,我将其注入如下:


我已经找到了解决这个问题的办法,但并不是我所希望的解决办法。我已经将构成mybatis cdi的各种类直接复制到我的程序中,并在META-INF/services/javax.enterprise.inject.spi.extension中注册了扩展,现在我可以成功地将映射器注入到我的程序中,并使用mybatis运行查询


我在MyBatis CDI GitHub存储库中提出了这个问题,如果有修复,我会更新这个答案。

我刚刚尝试添加@Local、@Stateless和@Named注释,但我仍然得到MyBatisCDI配置异常。您使用的是什么版本的GlassFish和Weld?我使用的是JBoss Wildfly 8.2。如果仍然出现该错误,则可能与尝试注入org.apache.ibatis.session.SqlSession的方式有关。或者,它可能是类路径问题的某种排列。你的项目是maven吗?奇怪的是我可以@InjectPrivateSqlSessionSqlSession;SQLSessionbean被很好地注入,我使用MyBatis运行查询。这个问题只有在我尝试注入映射程序bean时才会出现。例如,执行@Inject@Mapper private ToDoItemMapper ToDoItemMapper;由于CDIUtils.findSqlSessionFactory。。。找不到返回SqlSessionFactory的工厂方法
@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(...);
     }
     ...
}