Java 对于ejb.jar,mybatis未初始化
看起来我所做的还不完整,代码中仍然缺少一些东西 我希望在EJB中使用MyBatis+MyBatis cdi。我的jar只包含一个无状态ejb类和一个会话工厂生产者类。我认为问题在于EE容器从未调用我的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
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>