2015-06-11 3 views
0

Im новый с DropWizard и такая ситуация:Dropwizard Как настроить источник данных?

Мы имели веб-приложение, что теперь будет разбит на 3 части:

  • ядро: имеет все бизнес-аналитики,
  • апи: будет проект dropwizard, который будет вызывать основные методы, классы и т. д.,
  • и клиент: на самом деле это будет несколько клиентов; web, iphone, android и т. д.

Я пытаюсь создать небольшой проект сначала с помощью dropwizard и вызвать некоторые небольшие методы на ядре. Пример, если вызов: localhost: 8080/NewApi/getUserName? Id = 12345;

есть что-то на мой код так:

@GET 
public String getUser(@Auth User user, @QueryParam("id") Optional<String> id) { 

    String userName = net.newapp.core.data.User.getUserName(id); 
    return userName; 
} 

Однако я не смог настроить базу данных должным образом. Я прочитал учебник JDBI о dropwizard, но примеры предлагают использовать DAO и JDBI SQL API, но у меня уже есть свои запросы, которые мне нужны в ядре, я не хочу отдавать эту работу Dropwizard.

Чтобы проверить, правильно ли ядро ​​было отделено от старого проекта, я создал небольшой webapp, используя причал и настройку простого источника данных jndi, и использовал ядро ​​как простую библиотеку и отлично работал, и поскольку Dropwizard использует Jetty I что я мог бы настроить это в проекте Dropwizard, но из некоторых сообщений, которые я читал. Похоже, я не могу этого сделать, поэтому мой вопрос заключается в том, как я настраиваю простой источник данных, который могут использовать мои кланы на ядре.

Заранее спасибо

+0

Привет, какие рамки базы данных вы используете на своем ядре? У меня была аналогичная проблема с использованием hibernate в моем основном приложении, в конце концов я сделал, чтобы создать пакет hibernate (https://dropwizard.github.io/dropwizard/manual/hibernate.html) в API и отправить ' SessionFactory' в ядро ​​'hibernateBundle.getSessionFactory()'. – Carlos

+0

Привет, Карлос, на ядре. Мы не используем никаких баз данных DB, просто простой javax.sql.DataSource. – user2171127

+0

Возможно, это длинный снимок, но почему бы вам не попробовать: создать класс конфигурации с полем DataSourceFactory, подобным тому, что указано в ссылке. Затем в вашем методе выполнения выполните «ManagedDataSource a = configuration.getDataSourceFactory(). Build (новый MetricRegistry(),« Метрики базы данных »);' чтобы получить ManagedDataSource (который реализует javax.sql.DataSource), затем используйте Datasource в своем ядре проект. – Carlos

ответ

2

У вас есть разделение проблемы проблемы в вашем коде, что Dropwizard не собирается решать.

String userName = net.newapp.core.data.User.getUserName(id); 

Здесь у вас есть статический метод, который предназначен для предоставления вам имени пользователя с идентификатором. Откуда этот метод получает данные? Кто знает? Это статический метод, который не дает никаких других входов, поэтому для всех целей и задач это «волшебство».

Из описания вашего вопроса часть «магии» включает в себя поиск JNDI. Но для поиска JNDI по-прежнему требуется некоторое «имя» для поиска источника данных. Если в коде больше нет кода, это имя должно быть жестко закодировано в основной библиотеке. Скоростные магические константы в лучшем случае затрудняют миграцию в новые структуры.

Dropwizard вряд ли когда-либо поддержит JNDI, поскольку магическое поведение затрудняет понимание и отладку систем. Использование Jetty в качестве http-сервера - это деталь реализации, которая лучше всего оставлена ​​нетронутой. К счастью для вас, вам это не нужно.

Я предполагаю, что в этот момент, потому что вы на самом деле не сказал ничего о том, как вам нужно JNDI настроен, но я буду считать, так как большинство учебников по JNDI сделать это таким образом, что вам нужно a DataSource объект, связанный с именем, которое выглядит как java:comp/env/jdbc/mydatasource.Если это так, и предполагается, что ваш источник данных настроен as described in the Dropwizard documentation, вы можете добавить что-то вроде следующего в ваш метод Application#run():

DataSourceFactory factory = config.getDataSourceFactory(); 
DataSource dataSource = factory.build(environment.metrics(), "mydatasource"); 

Context context = new InitialContext(); 
Context compCtx = (Context) context.lookup("java:comp"); 
Context envCtx = compCtx.createSubcontext("env"); 
Context jdbcCtx = envCtx.createSubcontext("jdbc"); 
jdbcCtx.bind("mydatasource", dataSource); 

Первые две строки как Dropwizard сделать DataSource, что не делает используйте JDBI. Остальное инициализирует контекст JNDI и регистрирует источник данных под соответствующим именем.

+0

Спасибо! Я получил «javax.naming.NoInitialContextException», пока не добавил «org.eclipse.jetty: jetty-jndi» в мои депи. – Rich

Смежные вопросы