我正在做的事情似乎并不完整,我的代码仍然缺少某些内容。
我想在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);
...
}
}
答案 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 。