Dropwizard HelloWorld
上篇我们介绍了Dropwizard的一些概念和理念,本篇我们主要是动手实践,写一个Dropwizard HelloWorld.
我们选择的是用Maven来构建
pom.xml
首先定义dropwizard.version
<properties>
<dropwizard.version>INSERT VERSION HERE</dropwizard.version>
</properties>
然后引入dorpwizard-core相关依赖:
<dependencies>
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-core</artifactId>
<version>${dropwizard.version}</version>
</dependency>
</dependencies>
到这里,maven的pom.xml已经定义好了,是时候开始写真正的代码了。
创建一个Configuration类
每个Dropwizard应用都有继承于Configuration
的子类来指定特定于环境的参数,这些参数可以在YAML
文件中进行配置,然后反序列化到您的应用程序的配置类和验证实例。
我们即将构建的应用是一个高性能的Hello World服务,我们的要求之一是,我们需要能够改变它如何从环境向环境say hello。我们首先需要指定至少两件事:一个用于say hello的模板和一个默认名称,以防用户没有指定它们的名称。
下面就是我们的配置类:
package com.example.helloworld;
import io.dropwizard.Configuration;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.hibernate.validator.constraints.NotEmpty;
public class HelloWorldConfiguration extends Configuration {
@NotEmpty
private String template;
@NotEmpty
private String defaultName = "Stranger";
@JsonProperty
public String getTemplate() {
return template;
}
@JsonProperty
public void setTemplate(String template) {
this.template = template;
}
@JsonProperty
public String getDefaultName() {
return defaultName;
}
@JsonProperty
public void setDefaultName(String name) {
this.defaultName = name;
}
}
这里发生了很多事情,所以让我们一点点揭开它的面纱。
当这个类从YAML文件中进行反序列化,将从YAML对象中拉取两个根级别的字段:template
,我们Hello World中saying的模版,defaultName
,默认使用的名字。template
和defaultName
都使用了@NotEmpty
注解,所以如果YAML配置文件有任何空白值或是丢失模板完全信息会抛出异常,而你的应用程序将无法启动。
template
和defaultName
的get和set方法,都使用了@JsonProperty
注解,让Jackson可以从YAML文件进行反序列化,也可以将它序列化。
YAML文件如下:
template: Hello, %s!
defaultName: Stranger
Dropwizard有更多的配置,但它们都有合理的默认设置,所以你可以只重点关注自己的配置文件。
在你即将运行jar包的路径中保存这个YAML文件,命名为hello-world.yml
,因为我们要很快的跑起来,所以我们需要它。下一步,我们将创建我们的Application类。
创建Application类
结合Configuration的子类,Application的子类组成了Dropwizard应用的核心。Application类将基本功能的各种包和命令组合在一起,现在,我们的HelloWorldApplication类如下:
package com.example.helloworld;
import io.dropwizard.Application;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import com.example.helloworld.resources.HelloWorldResource;
import com.example.helloworld.health.TemplateHealthCheck;
public class HelloWorldApplication extends Application<HelloWorldConfiguration> {
public static void main(String[] args) throws Exception {
new HelloWorldApplication().run(args);
}
@Override
public String getName() {
return "hello-world";
}
@Override
public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
// nothing to do yet
}
@Override
public void run(HelloWorldConfiguration configuration,
Environment environment) {
// nothing to do yet
}
}
你可以看到,HelloWorldConfiguration作为HelloWorldApplication的参数,初始化方法用于配置应用程序运行前所需的哥哥方面,如捆绑包、配置源等。此外,main方法作为应用程序的入口,到此为止,我们没有实现任何的功能点,可能有些枯燥,下面即将开始实现功能。