在ejb.jar的情况下,mybatis未初始化

时间:2017-04-03 20:26:43

标签: java cdi mybatis ear

我正在做的事情似乎并不完整,我的代码仍然缺少某些内容。

我想在EJB中使用MyBatis + mybatis-cdi。我的jar只包含一个无状态ejb类和一个会话工厂生成器类。我认为问题是我的MyBatis Session Factory Producer永远不会被EE容器调用(我无法在日志文件中看到" MyBatis SessionFactory is initializing..."日志条目)。

部署期间出现以下错误:

WELD-001408: Unsatisfied dependencies for type ConfigurationDao with qualifiers @Default at injection point ....

当我将相同的类(EJB +会话工厂生产者类)打包到war时,我可以在日志中看到会话工厂生成器被调用。但我需要将它们打包成一个简单的ejb而不是war,因为我正在构建一个由另一场战争使用的EJB服务。

这是我的装配结构:

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:

@Mapper
public interface ConfigurationDao {

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

    @Insert("INSERT INTO ...")
    void insert(Configuration configuration);
}

战争使用(球衣休息)

@Path("/")
public class MyClass {
    @Inject
    private ConfigurationService configurationService;

    @GET
    @Produces(MediaType.APPLICATION_UTF8_JSON)
    public String doSomething() {
        String something = configurationService.getStringValue(KEY);
        ...
    }
}

1 个答案:

答案 0 :(得分:0)

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

@Local(ISqlSessionFactoryProvider.class)
@Stateless
public class SqlSessionFactoryProvider implements ISqlSessionFactoryProvider


@Local
public interface ISqlSessionFactoryProvider {

    SqlSessionFactory produceFactory() throws IOException;

}

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

在我的其他应用中:一个简单的webapp,我声明 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(对于ejb-jar)目录中的

可能允许容器服务器激活/加载一些东西。 我刚刚checked上切换CDI。

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