动手操作 Dropwizard REST API

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(393)   2023-06-26 07:54:18

Dropwizard 是一个面向 REST 的框架,它将多个 Java 包组合成一个有凝聚力的整体。它是 Spring(和 Spring 的 WebMVC 包)的替代品。 Dropwizard 提供更流畅的体验。它采用比 Spring 更多的约定配置,并消除了大部分与交付 REST API 无关的 API 表面。

开始一个新的 Dropwizard 项目

让我们从通过官方 Dropwizard Maven 原型搭建一个新项目开始。在您的本地系统上找到一个合适的位置,然后从命令行输入清单 1 中的命令。

清单 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 文件。

清单 2. SongWriters 端点

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 所示。

清单 3. 注册 SongWriters 处理程序

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 的内容。

清单 4. SongWriter 域模型类

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。

清单 5. SongWriterRepo 类

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 所示。

清单 6. 修改后的 SongWriters 类

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 类中连接在一起。

清单 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 所示。

清单 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 的内容放入其中。

清单 9. 配置 YAML

---songWriters:  - John Lennon  - Jeff Lynne

现在将 com.infoworld.DemoConfiguration.java 文件更改为如清单 10 所示。该文件用于通过 Jackson 对配置文件建模。

清单 10. 配置 java

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 所示。

清单 11. 使用配置文件在 DemoApplication.java 中预加载词曲作者

    @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 之后引用的。

清单 12. 使用配置文件运行应用程序

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

相关阅读

基础设施即代码 vendor 缅甸语 is adding support for 爪哇 and YAML, as it looks to allow software developers to...
Java Development Kit (JDK) 是 Java 编程中使用的三个核心技术包之一,另外两个是 JVM(Java 虚拟机)和 JRE(Java 运行时环境)。区分这三种技术并了解...
当应用程序开发人员或架构师的任务是探索容器化应用程序提供的可能性时,没有什么比红帽容器开发套件 (CDK) 更容易了。 Red Hat CDK 拥有本地 OSX、Linux 或 Windows ...
Jakarta EE 10, the latest version of the Eclipse Foundation 的企业 Java 平台, arrives today, emphasizi...
JetBrains has launched the Qodana code quality monitoring platform. Qodana integrates with the Je...
史蒂文格兰尚 is a longtime software executive, with leadership experience at Microsoft, OpenLogic, and ...
Despite the 对软件工程专业人员的不懈需求 before and throughout the global pandemic, entry-level and college-gra...
开发 Java 企业版的 Eclipse 基金会的 Jakarta EE 工作组发布了 Jakarta EE 9.1 平台和 Web 配置文件规范,突出强调了与 Java Standard Ed...
Java is 同时, 面向对象, and intended to let application developers “一次编写,随处运行” (WORA). Java is consider...
Dropwizard 是一个面向 REST 的框架,它将多个 Java 包组合成一个有凝聚力的整体。它是 Spring(和 Spring 的 WebMVC 包)的替代品。 Dropwizard ...