Dropwizard 是一个面向 REST 的框架,它将多个 Java 包组合成一个有凝聚力的整体。它是 Spring(和 Spring 的 WebMVC 包)的替代品。 Dropwizard 提供更流畅的体验。它采用比 Spring 更多的约定配置,并消除了大部分与交付 REST API 无关的 API 表面。
让我们从通过官方 Dropwizard Maven 原型搭建一个新项目开始。在您的本地系统上找到一个合适的位置,然后从命令行输入清单 1 中的命令。
mvn archetype:generate -DarchetypeGroupId=io.dropwizard.archetypes -DarchetypeArtifactId=java-simple -DarchetypeVersion=2.0.0
这将以交互模式运行。我使用了 com.infoworld 的组 ID 和 Demo 的工件 ID。我还使用了 Demo 作为名称。
原型完成自身部署后,您可以cd
进入您的目录(在我的例子中,cd Demo
)。现在您使用 mvn clean package
安装依赖项。
现在可以运行该应用程序
java -jar target/Demo-1.0-SNAPSHOT.jar server
(如果与 Demo 不同,请记住使用您给它的应用程序名称。)
如果你现在访问 localhost:8080,你会看到一个默认的 JSON 格式的“未找到”错误:
{"code":404,"message":"HTTP 404 Not Found"}
到目前为止,应用程序只返回 404,因为没有映射端点。我想让您清楚地了解这是如何使用 Dropwizard 完成的。我们将通过映射一个简单的字符串端点来隔离进程。
第 1 步是创建一个充当路径处理程序的类。请记住,Dropwizard 的使命是将几个一流的库整合到一个易于使用的包中。为了支持 RESTful 端点,Dropwizard 使用 Jersey。您的应用程序已经完全设置了 Jersey。路径映射是用球衣语言法完成的。
第 2 步是向应用程序注册处理程序类。让我们依次执行这两个步骤。
按照惯例,Dropwizard 端点处理程序位于 /src/main/java/com/infoworld/resources 文件夹(或您选择的任何组 ID)中。我们将添加一个端点处理程序来返回歌曲作者列表。正如您在清单 2 中看到的,我们将只返回最好的。在 /resources 目录中创建一个新的 SongWriters.java 文件。
package com.infoworld.resources;import javax.ws.rs.*;import javax.ws.rs.core.MediaType;import java.util.List;import java.util.Optional;@Path("/songwriters")@Produces(MediaType.APPLICATION_JSON)public class SongWriters { public SongWriters() { } @GET public String getBrands() { return "{'name':'Roger Waters','name':'Tom Petty'}"; }}
清单 2 相当简单。类本身通过 @Path
注释指定路径,JSON 通过 @Produces
注释指定为媒体类型。接下来,返回字符串的 getBrands()
方法通过 GET HTTP
方法>@GET 注解。该方法只返回一个硬编码的字符串,表示一组词曲作者。
现在注册处理程序。打开 /src/main/java/com/infoworld/DemoApplication.java 文件并将 run()
方法修改为如清单 3 所示。
import com.infoworld.resources.SongWriters;// ...public void run(final DemoConfiguration configuration, final Environment environment) { SongWriters songWriters = new SongWriters(); environment.jersey().register(songWriters); }
同样,相当简单。清单 3 导入您刚刚创建的类,然后使用 Environment
对象访问 Jersey 并注册处理程序。请注意,run
方法还接收一个 DemoConfiguration
对象,您马上就会看到它的运行情况。
现在,如果您访问 localhost:8080/songwriters,您将获得硬编码的 JSON。请注意,系统已无缝处理将字符串作为 JSON 返回。
现在您想从硬编码字符串转变为使用实际的域对象。首先创建一个 /src/main/java/com/infoworld/domain/SongWriter.java 文件,并为其提供清单 4 的内容。
package com.infoworld.domain;import java.util.ArrayList;import java.util.List;public class SongWriter { private final String name; private List songs = new ArrayList<>(); public SongWriter(final String name, final List songs) { this.name = name; this.songs = songs; } public String getName() { return name; } public List getSongs(){ return this.songs; }}
现在我们将添加一个存储库类来表示数据访问层。创建一个新的文件夹和文件:/src/main/java/com/infoworld/repo/SongWriterRepo.java。
package com.infoworld.repo;import com.infoworld.domain.SongWriter;import java.util.List;import java.util.ArrayList;import java.util.Optional;import java.util.stream.Collectors;public class SongWriterRepo { private final List songWriters; public SongWriterRepo(){ this.songWriters = new ArrayList(); } public SongWriterRepo(List songWriters){ this.songWriters = songWriters; } public List findAll(){ return songWriters; } public Optional getByName(final String name){ return songWriters.stream().filter(sw -> sw.getName().equals(name)).findFirst(); }}
如清单 5 所示,SongWriterRepo 负责通过 findAll()
方法返回 List
中的所有 SongWriter 对象,而getByName()
方法获取由传入的字符串名称指定的词曲作者。
现在我们将使用新层来驱动资源端点返回的 JSON。将 com.infoworld.resource.SongWriters 修改为如清单 6 所示。
package com.infoworld.resources;import javax.ws.rs.*;import javax.ws.rs.core.MediaType;import java.util.List;import java.util.Optional;import com.infoworld.repo.SongWriterRepo;import com.infoworld.domain.SongWriter;@Path("/songwriters")@Produces(MediaType.APPLICATION_JSON)public class SongWriters { private final SongWriterRepo repo; public SongWriters(SongWriterRepo repo) { this.repo = repo; } @GET public List getBrands() { return repo.findAll(); }}
清单 6 消除了硬编码字符串,转而引用构造函数中设置的 SongWriterRepo
类。现在看一下清单 7,其中这些类在 DemoApplication
类中连接在一起。
package com.infoworld;import io.dropwizard.Application;import io.dropwizard.setup.Bootstrap;import io.dropwizard.setup.Environment;import com.infoworld.resources.SongWriters;import com.infoworld.repo.SongWriterRepo;public class DemoApplication extends Application {// ... @Override public void run(final DemoConfiguration configuration, final Environment environment) { SongWriterRepo swRepo = new SongWriterRepo(); SongWriters songWriters = new SongWriters(swRepo); environment.jersey().register(songWriters); }}
返回到 DemoApplication
类,并按照清单 7 所示对其进行修改。请注意,您现在实例化了 SongWriterRepo
对象并参数化了 SongWriters
资源对象,然后再将其交给 Jersey。
现在,如果您重建项目并访问 localhost:8080/songwriters,您会发现一个空数组。让我们添加一个硬编码的词曲作者,如清单 8 所示。
public void run(final DW2Configuration configuration, final Environment environment) { List preload = new ArrayList(); preload.add(new SongWriter("Mark Knopfler", new ArrayList())); SongWriterRepo swRepo = new SongWriterRepo(preload); SongWriters songWriters = new SongWriters(swRepo); environment.jersey().register(songWriters); }
现在,当你到达终点时,你会得到一个结果。
在 src/main/resources/Demo-Config.yml 添加一个新的配置文件,并将清单 9 的内容放入其中。
---songWriters: - John Lennon - Jeff Lynne
现在将 com.infoworld.DemoConfiguration.java 文件更改为如清单 10 所示。该文件用于通过 Jackson 对配置文件建模。
package com.infoworld;import io.dropwizard.Configuration;import com.fasterxml.jackson.annotation.JsonProperty;import org.hibernate.validator.constraints.*;import javax.validation.constraints.*;import com.fasterxml.jackson.annotation.JsonCreator;import com.fasterxml.jackson.annotation.JsonProperty;import java.util.List;import java.util.ArrayList;public class DW2Configuration extends Configuration { private List<String> songWriters; @JsonCreator public DW2Configuration(@JsonProperty("songWriters") List<String> songWriters){ this.songWriters = songWriters; } public List<String> getSongWriters(){ return this.songWriters; }}
现在使用 DemoApplication
中的文件,如清单 11 所示。
@Override public void run(final DemoConfiguration configuration, final Environment environment) { List preload = new ArrayList(); configuration.getSongWriters().forEach(sw -> preload.add(new SongWriter(sw, new ArrayList()))); SongWriterRepo swRepo = new SongWriterRepo(preload); SongWriters songWriters = new SongWriters(swRepo); environment.jersey().register(songWriters); }
清单 11 中的主要变化是配置文件被混合到 DemoConfiguration
类中,填充 getSongWriters()
方法用于预加载存储库类。
要使用配置文件运行此应用程序,需要稍作更改。请注意,在清单 12 中,该文件是在调用 server
之后引用的。
java -jar target/DW2-1.0-SNAPSHOT.jar server src/main/resources/DW2-config.yml
现在,当您访问位于 localhost:8080/songwriters 的应用程序时,您会看到预加载的歌曲作者。
Dropwizard 是基于 Spring 的 RESTful API 的精益替代品。正如您在此处看到的,它侧重于提供一个简单但足够的堆栈来满足这些需求。
这里 提供了演示应用程序的源代码。
地址:https://www.cundage.com/article/3645503-hands-on-with-dropwizard-rest-apis.html