<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Dropwizard 教程 – HelloWorld 示例 > 原文: [https://howtodoinjava.com/dropwizard/tutorial-and-hello-world-example/](https://howtodoinjava.com/dropwizard/tutorial-and-hello-world-example/) Dropwizard 是用于快速開發 REST API 的開源 Java 框架。 Dropwizard 是一種生態系統,其中包含捆綁到單個程序包中的所有依賴項(例如,Jersey,Jackson 或 Jetty),也可以作為單獨的模塊添加。 如果不使用 dropwizard,最終將自己收集所有依賴項,由于各種 Java 庫之間的版本不匹配,通常會導致類加載問題。 Dropwizard 為您解決了這個問題,并將穩定,成熟的庫組合到一個簡單,輕巧的程序包中,使您可以專注于完成工作。 讓我們**逐步使用**來學習使用 dropwizard 構建 REST API。 ```java Table of Contents Libraries included inside dropwizard Setup dropwizard with maven Create REST Application Class Create REST Resource and APIs Build Resource Representations Request Validation Verify REST APIs ``` 您將需要 **Java8** 來運行此代碼中給出的示例,這些示例是使用 dropwizard 1.0.0 版開發的。 ## dropwizard 中包含的庫 將 dropwizard 包含到項目中后,您將獲得以下庫添加到您的類路徑中。 * [Jersey](//howtodoinjava.com/jersey-jax-rs-tutorials/) – 用于構建 RESTful Web 應用。 * [Jetty](https://www.eclipse.org/jetty/) – Dropwizard 使用 Jetty HTTP 庫將 HTTP 服務器直接嵌入到您的項目中。 * [Jackson](https://github.com/FasterXML/jackson) - 用于對象到 JSON 的轉換。 它允許直接使用 JAXB 注解導出域模型。 * [Guava](https://github.com/google/guava) – 高度優化的不可變數據結構,可加快開發速度。 * [Logback](http://logback.qos.ch/) 和 [SLF4j](http://www.slf4j.org/) – 用于高性能和靈活的日志記錄。 * [Hiberante 驗證器](http://www.hibernate.org/subprojects/validator.html) – 一個簡單的聲明性框架,用于驗證用戶輸入并生成有用且對 i18n 友好的錯誤消息。 * [Apache HTTPClient](https://hc.apache.org/httpcomponents-client-ga/index.html) – 用于與其他 Web 服務的高層和高層交互。 * [JDBI](http://www.jdbi.org/) - 在 Java 中使用關系數據庫的最直接方法。 * [Liquidbase](http://www.liquibase.org/) – 在整個開發和發布周期中,始終檢查數據庫模式。 * [FreeMarker](http://freemarker.sourceforge.net/) – 模板系統。 * [Mustache](https://mustache.github.io/) – 適用于更多面向用戶的應用的簡單模板系統。 * [Joda Time](http://www.joda.org/joda-time/) –非常完整和理智的庫,用于處理日期和時間。 ## 用 Maven 設置 dropwizard 我們的項目將基于`maven-archetype-quickstart`原型。 您可以使用命令提示符來創建項目,或[使用 eclipse 創建簡單的 Maven Java 項目](//howtodoinjava.com/maven/create-a-simple-java-project-using-maven/)。 ```java mvn archetype:generate -DgroupId=com.howtodoinjava.demo -DartifactId=DropWizardExample -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false ``` 生成的項目也將具有`pom.xml`文件。 在此處添加 dropwizard 依賴項。 ```java <properties> <dropwizard.version>1.0.0</dropwizard.version> </properties> <dependencies> <dependency> <groupId>io.dropwizard</groupId> <artifactId>dropwizard-core</artifactId> <version>${dropwizard.version}</version> </dependency> </dependencies> ``` 這將下載所有 jar 文件并將它們添加到您的類路徑中。 為了向我們的項目添加構建和程序包支持,我們將使用 [maven-shade 插件](//howtodoinjava.com/maven/maven-shade-plugin-create-uberfat-jar-example/),它將允許我們將我們的項目及其依賴項完全打包到一個獨立的 JAR 文件中(胖/Uber JAR),可以按原樣分發和執行。 完整的`pom.xml`文件如下所示。 ```java <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd; <modelVersion>4.0.0</modelVersion> <groupId>com.howtodoinjava.demo</groupId> <artifactId>DropWizardExample</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>DropWizardExample</name> <url>http://maven.apache.org</url> <properties> <dropwizard.version>1.0.0</dropwizard.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>io.dropwizard</groupId> <artifactId>dropwizard-core</artifactId> <version>${dropwizard.version}</version> </dependency> </dependencies> <build> <finalName>DropWizardExample-${version}</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.howtodoinjava.rest.App</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project> ``` ## 創建 REST 應用類 應用類是任何 dropwizard 應用的入口點。 它需要擴展`io.dropwizard.Application`類并實現`initialize(Bootstrap<Configuration>)`和`run(Configuration, Environment)`方法。 他們準備應用的運行時環境。 要調用`run`方法,您需要具有`public static void main(String[] args) {}`方法,當您將應用作為 jar 文件運行時,該方法將由`java -jar`命令調用。 ```java package com.howtodoinjava.rest; import io.dropwizard.Application; import io.dropwizard.Configuration; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.howtodoinjava.rest.controller.EmployeeRESTController; public class App extends Application<Configuration> { private static final Logger LOGGER = LoggerFactory.getLogger(App.class); @Override public void initialize(Bootstrap<Configuration> b) { } @Override public void run(Configuration c, Environment e) throws Exception { LOGGER.info("Registering REST resources"); e.jersey().register(new EmployeeRESTController(e.getValidator())); } public static void main(String[] args) throws Exception { new App().run(args); } } ``` 為了執行 JAR 文件,我們在命令中添加**服務器**參數,該參數啟動嵌入式 HTTP 服務器(Jetty)以運行我們的服務。 ```java java -jar target\DropWizardExample.jar server ``` Dropwizard 的嵌入式 Jetty 服務器將默認嘗試綁定到端口 **8080** 和 **8081** 。 服務器使用端口 8080 來向應用提供傳入的 HTTP 請求,而 Dropwizard 的管理界面則使用 8081 端口。 我們還導入了必要的`Logger`和`LoggerFactory`類,以構造可用于日志記錄需求的`Logger`實例。 ## 創建 REST 資源和 API 現在,當您添加了應用引導類后,現在可以添加包含 REST API 的 REST 資源。 在此示例中,我創建并創建了員工管理應用 - 因此它具有用于創建/更新/刪除員工記錄的 API。 此類將負責處理 HTTP 請求并生成 JSON 響應。 由于類路徑中包含 Jersey,因此我們將使用它來構建 REST API。 ```java package com.howtodoinjava.rest.controller; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validator; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import com.howtodoinjava.rest.dao.EmployeeDB; import com.howtodoinjava.rest.representations.Employee; @Path("/employees") @Produces(MediaType.APPLICATION_JSON) public class EmployeeRESTController { private final Validator validator; public EmployeeRESTController(Validator validator) { this.validator = validator; } @GET public Response getEmployees() { return Response.ok(EmployeeDB.getEmployees()).build(); } @GET @Path("/{id}") public Response getEmployeeById(@PathParam("id") Integer id) { Employee employee = EmployeeDB.getEmployee(id); if (employee != null) return Response.ok(employee).build(); else return Response.status(Status.NOT_FOUND).build(); } @POST public Response createEmployee(Employee employee) throws URISyntaxException { // validation Set<ConstraintViolation<Employee>> violations = validator.validate(employee); Employee e = EmployeeDB.getEmployee(employee.getId()); if (violations.size() > 0) { ArrayList<String> validationMessages = new ArrayList<String>(); for (ConstraintViolation<Employee> violation : violations) { validationMessages.add(violation.getPropertyPath().toString() + ": " + violation.getMessage()); } return Response.status(Status.BAD_REQUEST).entity(validationMessages).build(); } if (e != null) { EmployeeDB.updateEmployee(employee.getId(), employee); return Response.created(new URI("/employees/" + employee.getId())) .build(); } else return Response.status(Status.NOT_FOUND).build(); } @PUT @Path("/{id}") public Response updateEmployeeById(@PathParam("id") Integer id, Employee employee) { // validation Set<ConstraintViolation<Employee>> violations = validator.validate(employee); Employee e = EmployeeDB.getEmployee(employee.getId()); if (violations.size() > 0) { ArrayList<String> validationMessages = new ArrayList<String>(); for (ConstraintViolation<Employee> violation : violations) { validationMessages.add(violation.getPropertyPath().toString() + ": " + violation.getMessage()); } return Response.status(Status.BAD_REQUEST).entity(validationMessages).build(); } if (e != null) { employee.setId(id); EmployeeDB.updateEmployee(id, employee); return Response.ok(employee).build(); } else return Response.status(Status.NOT_FOUND).build(); } @DELETE @Path("/{id}") public Response removeEmployeeById(@PathParam("id") Integer id) { Employee employee = EmployeeDB.getEmployee(id); if (employee != null) { EmployeeDB.removeEmployee(id); return Response.ok().build(); } else return Response.status(Status.NOT_FOUND).build(); } } ``` 為了模仿數據庫,我創建了`EmployeeDB`類,該類將員工記錄和更新存儲在內存中。 ```java package com.howtodoinjava.rest.dao; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.howtodoinjava.rest.representations.Employee; public class EmployeeDB { public static HashMap<Integer, Employee> employees = new HashMap<>(); static{ employees.put(1, new Employee(1, "Lokesh", "Gupta", "India")); employees.put(2, new Employee(2, "John", "Gruber", "USA")); employees.put(3, new Employee(3, "Melcum", "Marshal", "AUS")); } public static List<Employee> getEmployees(){ return new ArrayList<Employee>(employees.values()); } public static Employee getEmployee(Integer id){ return employees.get(id); } public static void updateEmployee(Integer id, Employee employee){ employees.put(id, employee); } public static void removeEmployee(Integer id){ employees.remove(id); } } ``` ## 建立資源表示 表示是保存數據并序列化為 JSON 的內容。 它是 RESTful 應用的模型。 當將 Jersey 與 Jackson 結合使用時,構建資源表示形式所需的全部就是 – 遵循 Java bean 標準的簡單 POJO。 Jackson 根據每個類的設置器方法及其返回類型來遞歸構造 JSON 字符串。 任何`java.util.List`類型的實例都將轉換為 JSON 數組。 ```java package com.howtodoinjava.rest.representations; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotBlank; public class Employee { @NotNull private Integer id; @NotBlank @Length(min=2, max=255) private String firstName; @NotBlank @Length(min=2, max=255) private String lastName; @Pattern(regexp=".+@.+\\.[a-z]+") private String email; public Employee(){ } public Employee(Integer id, String firstName, String lastName, String email) { this.id = id; this.firstName = firstName; this.lastName = lastName; this.email = email; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "Emplyee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + "]"; } } ``` 如果在某些情況下需要,可以通過將`@JsonIgnore`注解添加到其設置器來防止該屬性成為 JSON 表示的一部分。 ## 請求驗證 接受`PUT`和`POST`請求時,您需要在請求正文中驗證用戶提交的實體內容。 Dropwizard 為此使用 Hiberate 驗證器。 添加驗證需要執行以下步驟。 1. #### 在表示形式類中添加驗證注解 ```java @NotNull private Integer id; @NotBlank @Length(min=2, max=255) private String firstName; @NotBlank @Length(min=2, max=255) private String lastName; @Pattern(regexp=".+@.+\\.[a-z]+") private String email; ``` 2. #### 在應用的 REST 資源中注入`Environment.getValidator()` ```java @Override public void run(Configuration c, Environment e) throws Exception { LOGGER.info("Registering REST resources"); e.jersey().register(new EmployeeRESTController(e.getValidator())); } ``` 4. #### 在 REST 資源中使用驗證器 ```java public class EmployeeRESTController { private final Validator validator; public EmployeeRESTController(Validator validator) { this.validator = validator; } @POST public Response createEmployee(Employee employee) throws URISyntaxException { Set<ConstraintViolation<Employee>> violations = validator.validate(employee); Employee e = EmployeeDB.getEmployee(employee.getId()); if (violations.size() > 0) { ArrayList<String> validationMessages = new ArrayList<String>(); for (ConstraintViolation<Employee> violation : violations) { validationMessages.add(violation.getPropertyPath().toString() + ": " + violation.getMessage()); } return Response.status(Status.BAD_REQUEST).entity(validationMessages).build(); } //Create Employee code here } } ``` ## 驗證 REST API 現在,當我們創建并添加了 REST API 的驗證后,讓我們對其進行測試。 #### 構建應用 uber jar 文件 ```java > mvn clean package ``` #### 在 Jetty 服務器中啟動應用 ```java > java -jar target\DropWizardExample-0.0.1-SNAPSHOT.jar server ``` #### 訪問 URI `http://localhost:8080/employees` 這將返回員工集合和相關的響應頭。 ![Dropwizard - GET Request Example - 1](https://img.kancloud.cn/67/2f/672f204eb059718bf29e09d0e7cef655_949x371.png) Dropwizard – GET 請求示例 – 1 #### 訪問 URI `http://localhost:8080/employees/1` 這將返回 ID 為 1 的員工記錄。 ![Dropwizard - GET Request Example - 2](https://img.kancloud.cn/4e/99/4e99659b7de5cd3f013a5d83d7517b38_948x353.png) Dropwizard – GET 請求示例 – 2 #### 使用無效的請求數據發送 HTTP PUT `http://localhost:8080/employees/1` 您將收到驗證消息。 ![Dropwizard - Validation Example](https://img.kancloud.cn/0b/3a/0b3a5856acc3db30c3d3db6bdc47d23c_946x522.png) Dropwizard – 驗證示例 #### 使用正確的數據發送 HTTP PUT `http://localhost:8080/employees/1` 員工記錄將成功更新。 ![Dropwizard - PUT request Example](https://img.kancloud.cn/4c/30/4c3049b0a05e198f5687a6e8eb677bb4_950x536.png) Dropwizard – PUT 請求示例 同樣,您可以測試其他 API 和方案。 [源碼下載](//howtodoinjava.com/wp-content/downloads/DropWizardExample.zip) 在評論部分讓我知道您的問題。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看