java - 如何使用 vertx 和 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)的方法。
推荐阅读
- flutter - context.select 没有为 BuildContext 定义
- postgresql - 查找查询的反义词
- spring-boot - 使用 Kafka 消息传递和 Hazelcast 作为持久性提供者的 Apache Avro
- kotlin - 为什么 Kotlin Iterable 减号运算符只返回一个没有第一次出现单个元素操作数的结果?
- c - 在自定义 LinkedList 上查找重复节点通过递归引发分段错误
- amazon-s3 - AWS 上的 VM 导入给了我“ClientError:引导磁盘未使用 MBR 分区”。错误
- python - 在 python 中调整图像大小而不使用 resize() - 最近邻
- javascript - 使用 Jest 模拟返回函数的 node_modules?
- amazon-web-services - 在 y 轴上对堆叠图进行排序
- python - Python通过从正则表达式模式拆分来创建字符串元组列表