Статьи

Интеграция Dropwizard и Guice

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

Резюме

Спасибо за чтение, надеюсь, эта статья была вам полезна. Вот некоторые ссылки, которые были использованы в этой статье.