Dropwizard , как описано на их веб-сайте, представляет собой «инфраструктуру Java для разработки высокопроизводительных веб-сервисов RESTful, удобных в использовании». Я использовал его недавно после того, как увидел, что он упоминается в канале Yammer моей компании (как ни странно, фреймворк появился из Yammer), и мне это очень понравилось. Одна из вещей, которые я интегрировал в мои настройки Dropwizard, была Guice , так как довольно быстро я обнаружил, что мне нужен способ внедрить мои зависимости. Остальная часть этой статьи будет посвящена тому, как показать, как склеить Dropwizard и Guice.
Предпосылки
- Работает JDK (я использую Java 1.8)
- Maven 3
Начиная
Начните с использования архетипа быстрого запуска Maven для создания оболочки проекта Maven. Поэтому в терминале выполните следующую команду. Не стесняйтесь изменять groupId и artifactId в соответствии с вашими собственными целями.
$ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=com.github.codingricky -DartifactId=DropWizardGuice -Dversion=1.0-SNAPSHOT
Теперь обновите зависимости в pom.xml, чтобы включить то, что требуется для этой статьи.
<dependencies> <dependency> <groupId>io.dropwizard</groupId> <artifactId>dropwizard-core</artifactId> <version>0.7.0</version> </dependency> <dependency> <groupId>com.hubspot.dropwizard</groupId> <artifactId>dropwizard-guice</artifactId> <version>0.7.0.2</version> </dependency> <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>3.0</version> </dependency> </dependencies>
Это добавляет в dropwizard рамках, в Guice dropwizard расширения и Guice себя.
Добавление конфигурации
Это демо будет сделано, это взять сообщение из файла конфигурации yml и вставить его в качестве зависимости в ресурс .
Давайте теперь добавим класс конфигурации. Это будет класс конфигурации dropwizard, поэтому ему потребуется расширить класс io.dropwizard.Configuration . Добавьте поле сообщения с соответствующими получателями / установщиками, чтобы dropwizard мог получить сообщение для вставки в наш ресурс.
package com.github.codingricky; import io.dropwizard.Configuration; import org.hibernate.validator.constraints.NotEmpty; public class ServerConfiguration extends Configuration { @NotEmpty private String message; public String getMessage() { return message; } }
Теперь создайте config.yml и добавьте в него это свойство сообщения. Поместите это в корневой каталог проекта, на том же уровне, что и файл pom.xml .
message: "Bonjour"
Добавление ресурса
Ресурс в dropwizard говорят представляет REST ресурс. Это обработчик HTTP-запроса. Мы создадим тот, который отвечает на путь / привет, и он выведет наше сообщение из файла config.yml . Это где Guice будет участвовать. Создайте этот класс в src / main / java .
package com.github.codingricky; import com.google.inject.Inject; import com.google.inject.name.Named; import javax.ws.rs.GET; import javax.ws.rs.Path; @Path("/hello") public class HelloResource { private final String message; @Inject public HelloResource(@Named("message") String message) { this.message = message; } @GET public String hello() { return message; } }
Теперь этот класс ожидает, что Guice внедрит свойство @Named с именем message .
Теперь модуль Guice
Теперь нам нужно немного связующего кода, который берет сообщение из файла конфигурации, чтобы сделать его доступным для Guice . Создайте модуль ServerModule, который реализует модуль com.google.inject.Module .
package com.github.codingricky; import com.google.inject.Binder; import com.google.inject.Module; import com.google.inject.Provides; import javax.inject.Named; public class ServerModule implements Module { @Override public void configure(Binder binder) { } @Provides @Named("message") public String provideMessage(ServerConfiguration serverConfiguration) { return serverConfiguration.getMessage(); } }
Обратите особое внимание , что в provideMessage , который извлекает сообщение из ServerConfiguration .
Наконец приложение
Теперь нам нужно связать все вместе. Класс приложения запустит приложение, а также создаст пакет Guice, который инкапсулирует ServerModule и ServerConfiguration .
package com.github.codingricky; import com.hubspot.dropwizard.guice.GuiceBundle; import io.dropwizard.Application; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; public class ServerApplication extends Application<ServerConfiguration> { @Override public void initialize(Bootstrap<ServerConfiguration> bootstrap) { GuiceBundle<ServerConfiguration> guiceBundle = GuiceBundle.<ServerConfiguration>newBuilder() .addModule(new ServerModule()) .setConfigClass(ServerConfiguration.class) .enableAutoConfig(getClass().getPackage().getName()) .build(); bootstrap.addBundle(guiceBundle); } @Override public void run(ServerConfiguration configuration, Environment environment) throws Exception { } public static void main(String[] args) throws Exception { new ServerApplication().run(args); } }
Погнали!
Последний шаг — собрать все вещи и запустить их.
Поэтому добавьте в плагин сведения, которые упакуют приложение и позволят запустить его из командной строки.
<plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.6</version> <configuration> <createDependencyReducedPom>true</createDependencyReducedPom> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.github.codingricky.ServerApplication</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins>
Теперь мы можем построить все через Maven.
$ mvn clean install
Наконец мы можем запустить приложение
$ java -jar target/DropWizardGuice-1.0-SNAPSHOT.jar server config.yml
Если приложение запускается правильно, вы сможете зайти в браузер и нажать на ссылку, http: // localhost: 8080 / hello
Резюме
Спасибо за чтение, надеюсь, эта статья была вам полезна. Вот некоторые ссылки, которые были использованы в этой статье.