Я планирую удалить JPA (Eclipselink) из моего проекта и использовать MyBatis вместо него. Я искал какой-нибудь хороший путеводитель, что лучше всего использовать MyBatis в контейнере EE (статическая сессия ejb) и JNDI datasource + DAO pattern + CDI (я не использую Spring!). К сожалению, я не нашел хорошей документации об этом.DAO pattern + JNDI datasouce + CDI с MyBatis
Есть ли способ инициализировать MyBatis и использовать источник данных JNDI без файла конфигурации xml?
Каков наилучший способ MyBatis для реализации шаблона DAO и впрыскивать мои классы dao в Ecl с отсутствием состояния с CDI?
Я использую Java 8 + Glassfish (сервер Payara EE) + MyBatis 3.4.2.
UPDATE-1
Я следовал инструкциям на этой странице http://www.mybatis.org/cdi/getting-started.html, но она не работает для меня.
Это исключение во время выполнения, что я получил с Glassfish (на самом деле это скумбриевидный гидролик) сервер приложений:
[2017-02-14T22:02:23.715+0100] [Payara 4.1] [INFO] [AS-WEB-GLUE-00172] [javax.enterprise.web] [tid: _ThreadID=101 _ThreadName=admin-listener(6)] [timeMillis: 1487106143715] [levelValue: 800] [[
Loading application [mybatis-demo-1.0#mybatis-demo-war-1.0.war] at [/demo]]]
[2017-02-14T22:02:23.770+0100] [Payara 4.1] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=101 _ThreadName=admin-listener(6)] [timeMillis: 1487106143770] [levelValue: 800] [[
mybatis-demo-1.0 was successfully deployed in 1,526 milliseconds.]]
[2017-02-14T22:03:00.333+0100] [Payara 4.1] [INFO] [] [javax.enterprise.web] [tid: _ThreadID=25 _ThreadName=http-listener-1(2)] [timeMillis: 1487106180333] [levelValue: 800] [[
WebModule[null] ServletContext.log():Marking servlet a.b.war.HelloServlet as unavailable]]
[2017-02-14T22:03:00.334+0100] [Payara 4.1] [WARNING] [] [javax.enterprise.web] [tid: _ThreadID=25 _ThreadName=http-listener-1(2)] [timeMillis: 1487106180334] [levelValue: 900] [[
StandardWrapperValve[a.b.war.HelloServlet]: Allocate exception for servlet a.b.war.HelloServlet
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type PersonMapper with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject private a.b.war.HelloServlet.personMapper
at a.b.war.HelloServlet.personMapper(HelloServlet.java:0)
Это мой тестовый сервлет:
@WebServlet("/servlet")
public class HelloServlet extends HttpServlet {
@Inject
private PersonMapper personMapper;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println(personMapper.getPerson(1L).toString());
}
Мой картографа класс:
@Mapper
public interface PersonMapper {
@Select("SELECT * FROM person WHERE id = #{id}")
Person getPerson(@Param("id") long id);
}
Кажется, что метод MyBatisSQLSessionFactory.getSqlSessionFactory() никогда не называется потому что я не вижу ничего в моем файле журнала.
Мой SessionFactory класс:
public class MyBatisSQLSessionFactory {
private static final Logger LOGGER = LoggerFactory.getLogger(MyBatisSQLSessionFactory.class);
@Produces
@ApplicationScoped
@SessionFactoryProvider
public SqlSessionFactory getSqlSessionFactory() throws IOException {
LOGGER.info("MyBatis is initializing...");
String resource = "mybatis-configuration.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
LOGGER.info("MyBatis has been initialized, SQL Session Factory: {}", sqlSessionFactory.toString());
return sqlSessionFactory;
}
}
И, наконец, структура моей войны:
*.war
│ index.html
│
├───META-INF
│ │ bean.xml
│ │ MANIFEST.MF
│ │
│ └───maven
│ ...
│
└───WEB-INF
├───classes
│ └───a
│ └───b
│ └───war
│ │ HelloServlet.class
│ │
│ └───mybatis
│ │ MyBatisSQLSessionFactory.class
│ │
│ └───dao
│ PersonMapper.class
│
└───lib
Может быть, я сделал ошибку, и я что-то забыл ...
ОБНОВЛЕНИЕ-2
«Сварщик не обнаруживает карту, если не используется по крайней мере одним соответствующим CDI-компонентом. И Servlet не является надлежащим CDI bean. Обход является аннотировать сервлет с @Dependent.» Вы можете найти более подробную информацию here.
Прежде всего, какую версию Java EE вы используете? –
Я добавил эту информацию в исходное сообщение. – zappee
не первая проблема, но, возможно, следующая: mybatis-configuration.xml требуется в пути к классам, по крайней мере, для определения transactionManager и reference jndi dataSource. – blackwizard