簡體   English   中英

如何使用vertx和quarkus發布靜態集合

[英]How to publish static collection with vertx and quarkus

我正在使用Quarkus及其vert.x擴展名構建應用程序。 現在,我想構建一個REST端點,該端點應流式傳輸所有保存的地址。 為了測試這種反應性數據源,我將不創建帶有示例地址的ArrayList並將其流化,以便我可以檢查我的測試是否有效。 但是我找不到如何流式傳輸收藏集的方法。

我的實際代碼:

    import io.vertx.reactivex.core.Vertx;
    import org.reactivestreams.Publisher;

    import javax.inject.Inject;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import java.util.ArrayList;
    import java.util.Collection;

    @Path("/addresses")
    public class AddressResource {
      private Collection<Address> adresses;

      @Inject private Vertx vertx;

      public AddressResource() {
        super();
        adresses = new ArrayList<>();
      }

      @GET
      @Produces(MediaType.SERVER_SENT_EVENTS)
      public Publisher<Address> get() {
        Address address = new Address();
        address.setStreet("590 Holly Street");
        address.setCity("Townsend");
        address.setState("Ohio");
        address.setZip(6794);
        adresses.add(address);
        adresses.add(address);
        adresses.add(address);
        adresses.add(address);
        adresses.add(address);
        adresses.add(address);

        // What to do here?
        return null;
      }
    }

這是我的測試:

    import io.quarkus.test.junit.QuarkusTest;
    import org.hamcrest.Matchers;
    import org.junit.jupiter.api.Test;

    import javax.json.bind.JsonbBuilder;
    import java.util.ArrayList;
    import java.util.List;

    import static io.restassured.RestAssured.given;

    @QuarkusTest
    public class DBServiceTest {

      @Test
      void testGetAddresses() throws InterruptedException {
        given()
            .when()
            .get("/addresses")
            .then()
            .statusCode(200)
            .body(Matchers.containsInAnyOrder(readTestAdresses().toArray()));
      }

      private List<Address> readTestAdresses() {
        return JsonbBuilder.create()
            .fromJson(
                this.getClass().getResourceAsStream("test-addresses.json"),
                new ArrayList<Address>() {}.getClass().getGenericSuperclass());
      }
    }

編輯1:我嘗試了以下操作:


    @GET
      @Produces(MediaType.SERVER_SENT_EVENTS)
      public Publisher<String> get() {
        Address address = new Address();
        address.setStreet("590 Holly Street");
        address.setCity("Townsend");
        address.setState("Ohio");
        address.setZip(6794);
        adresses.add(address);
        return Flowable.just("Test 1","Test 2","Test 3");
      }

這可行。 因此,問題必須與地址對象有關。

您可以使用類似

  @GET
  @Produces(MediaType.SERVER_SENT_EVENTS)
  public Publisher<String> get() {
    Address address = new Address();
    address.setStreet("590 Holly Street");
    address.setCity("Townsend");
    address.setState("Ohio");
    address.setZip(6794);
    return Flowable.just(address, address, address,....).map(a -> yourToString(a));
  }

其中yourToString是一種將創建正確的字符串表示形式(也許是json)的方法。

我可以解決它,我錯過了一個依賴項:

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>

並且不得不手動將我的對象轉換為json等,將返回類型更改為Publisher<String>

    import io.reactivex.Flowable;
    import io.vertx.core.json.Json;
    import org.reactivestreams.Publisher;

    import javax.ws.rs.Consumes;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import java.util.ArrayList;
    import java.util.Collection;

    @Path("/addresses")
    @Consumes(MediaType.APPLICATION_JSON)
    public class AddressResource {
      private Collection<Address> addresses;

      public AddressResource() {
        super();
        addresses = new ArrayList<>();
      }

      @GET
      @Produces(MediaType.SERVER_SENT_EVENTS)
      public Publisher<String> get() {
        Address address = new Address();
        address.setStreet("590 Holly Street");
        address.setCity("Townsend");
        address.setState("Ohio");
        address.setZip(6794);
        addresses.add(address);
        return Flowable.fromIterable(addresses).map(Json::encode);
      }
    }

我的測試也是錯誤的,這是現在的樣子:

    import io.quarkus.test.common.http.TestHTTPResource;
    import io.quarkus.test.junit.QuarkusTest;
    import org.junit.jupiter.api.Assertions;
    import org.junit.jupiter.api.DisplayName;
    import org.junit.jupiter.api.Test;

    import javax.json.bind.JsonbBuilder;
    import javax.ws.rs.client.Client;
    import javax.ws.rs.client.ClientBuilder;
    import javax.ws.rs.client.WebTarget;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.sse.SseEventSource;
    import java.net.URL;
    import java.util.*;
    import java.util.concurrent.CompletableFuture;

    import static org.assertj.core.api.Assertions.assertThat;

    @QuarkusTest
    public class DBServiceTest {

      @TestHTTPResource("/addresses")
      private URL enpointUrl;

      @Test
      @DisplayName("Get all addresses")
      void testGetAddresses() {
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target(String.valueOf(enpointUrl));
        try (SseEventSource source = SseEventSource.target(target).build()) {
          CompletableFuture<Collection<Address>> futureAddresses = new CompletableFuture<>();
          Set<Address> foundAddresses = new HashSet<>();
          source.register(
              event -> {
                if (!foundAddresses.add(
                    event.readData(Address.class, MediaType.APPLICATION_JSON_TYPE))) {
                  futureAddresses.complete(foundAddresses);
                }
              },
              Assertions::fail);
          source.open();
          Collection<Address> addresses = futureAddresses.join();
          assertThat(addresses).containsExactlyInAnyOrderElementsOf(readTestAdresses());
        }
      }

      private List<Address> readTestAdresses() {
        return JsonbBuilder.create()
            .fromJson(
                this.getClass().getResourceAsStream("test-addresses.json"),
                new ArrayList<Address>() {}.getClass().getGenericSuperclass());
      }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM