Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/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 对于ejb.jar,mybatis未初始化_Java_Cdi_Mybatis_Ear - Fatal编程技术网

Java 对于ejb.jar,mybatis未初始化

Java 对于ejb.jar,mybatis未初始化,java,cdi,mybatis,ear,Java,Cdi,Mybatis,Ear,看起来我所做的还不完整,代码中仍然缺少一些东西 我希望在EJB中使用MyBatis+MyBatis cdi。我的jar只包含一个无状态ejb类和一个会话工厂生产者类。我认为问题在于EE容器从未调用我的MyBatis会话工厂生产者(我看不到日志文件中的“MyBatis会话工厂正在初始化…”日志条目) 部署期间出现以下错误: WELD-001408: Unsatisfied dependencies for type ConfigurationDao with qualifiers @Default

看起来我所做的还不完整,代码中仍然缺少一些东西

我希望在EJB中使用MyBatis+MyBatis cdi。我的jar只包含一个无状态ejb类和一个会话工厂生产者类。我认为问题在于EE容器从未调用我的MyBatis会话工厂生产者(我看不到日志文件中的“
MyBatis会话工厂正在初始化…
”日志条目)

部署期间出现以下错误:

WELD-001408: Unsatisfied dependencies for type ConfigurationDao with qualifiers @Default at injection point ....
当我将相同的类(EJB+会话工厂生产者类)打包到war时,我可以在日志中看到调用了会话工厂生产者。但是我需要将它们打包到一个简单的ejb中,而不是war,因为我正在构建一个ejb服务,它被其他war使用

这是我的组装结构:

EAR
  +--- commons.jar (interfaces)
  +--- configuration-service.jar (stateless ejb + mybatis mapper interface + session factory producer)
  +--- restapi-1.war
  +--- restapi-2.war
以下类位于configuration service.jar中:

会话工厂生产者

//@Stateless
public class SessionFactoryProducer {

    private static final Logger LOGGER = ...;

    @ApplicationScoped
    @Produces
    @SessionFactoryProvider
    public SqlSessionFactory produce() throws Exception {
        LOGGER.info("MyBatis SessionFactory is initializing...");

        try (Reader reader = Resources.getResourceAsReader("mybatis.xml")) {
            return new SqlSessionFactoryBuilder().build(reader);
        }
    }
}
无状态ejb

@Stateless
public class ConfigurationBean implements ConfigurationService {

   @Inject
   private ConfigurationDao configurationDao;

   public void setStringValue(final Configuration configuration) {
      ...
      // save to database
      configurationDao.insert(configuration);
      ...
   }

   public String getStringValue(final String key) {
      return configurationDao.findByKey(key).map(Configuration::getValue).orElse(null);
   }
}
MyBatis制图器:

@Mapper
public interface ConfigurationDao {

    @Select("SELECT ...")
    Configuration findByKey(@Param("key") String key);

    @Insert("INSERT INTO ...")
    void insert(Configuration configuration);
}
战争使用(泽西岛休息)


对于我的ear/ejb应用程序,以下是我如何声明我的SessionFactoryProvider:

然后在EJB中,我注入SqlSession并从中检索映射器。但是直接注入映射器应该按照中的规定工作

在我的另一个应用程序:一个简单的Web应用程序中,我以与您相同的方式声明SessionFactoryProvider

这可能不是最好的方法,但它确实有效

我认为文件“empty”beans.xml的存在:

<?xml version="1.0" encoding="UTF-8"?>
<!-- This file can be an empty text file (0 bytes) -->
<!-- We're declaring the schema to save you time if you do have to configure 
  this in the future -->
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

</beans>

在WEB-INF(对于webapp)或META-INF(对于EJBJAR)目录中,容器服务器可以激活/加载一些东西。 我刚刚:它打开CDI


实际上,我使用它来声明TransactionInterceptor,它不应该是相关的。

错误实际上表明您正试图在某个地方注入
ConfigurationDAO
。您的问题应该主要包含以下信息:您在何处注入它,以及您在EAR部署结构中注入它的位置。它是'ConfigurationBean'中的注入点吗?如果是这样,您的EJBJAR中是否有
beans.xml
?我根据您的建议创建了一个新的无状态EJB,并将这个mybatis会话工厂注入到我的ConfigurationBean中,它工作得很好。下一个问题是MyBatis+容器管理事务:
@Local(ISqlSessionFactoryProvider.class)
@Stateless
public class SqlSessionFactoryProvider implements ISqlSessionFactoryProvider


@Local
public interface ISqlSessionFactoryProvider {

    SqlSessionFactory produceFactory() throws IOException;

}
<?xml version="1.0" encoding="UTF-8"?>
<!-- This file can be an empty text file (0 bytes) -->
<!-- We're declaring the schema to save you time if you do have to configure 
  this in the future -->
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

</beans>