我在使用 Quarkus 中的 REST 客户端(使用 org.eclipse.microprofile.rest.client.RestClientBuilder 构建)调用服务器上的 REST 端点时遇到问题。我非常想通过将 HTTP 请求和响应写入日志来调试服务,这样我就可以看到实际发送到服务器的内容。然而,我一直未能找到针对该特定问题的指南。我设法构建了一个日志过滤器,但只记录了 URL 和实体 toString 值,这与发送的 HTTP 请求和响应完全不同。请帮助我找到记录实际 HTTP 请求和响应的解决方案。
目前我正在使用 quarkus 开发一个应用程序。我有一个描述一切的 openapi yaml 文件。我想知道是否有 quarkus 扩展或工具可以用来生成可以生成和使用相同文件格式的其余端点。
我在 quarkus application.properties 中配置了一个值
skipvaluecheck=true
Run Code Online (Sandbox Code Playgroud)
现在,每当我想要执行测试时,我都希望将此值设置为 false 而不是 true。但我不想更改application.properties,因为它会影响最新的应用程序部署。我只是希望我的测试以 false 值执行,以便我的测试覆盖范围在声纳中变为绿色。
从java代码中,我通过下面的操作获取这个值
ConfigProvider.getConfig().getValue("skipvaluecheck", Boolean.class);
Run Code Online (Sandbox Code Playgroud)
Sprint boot 中已经存在类似的东西,我很好奇 quarkus 中是否也存在这样的东西
按照 Quarkus Rest Client 教程,我需要在 application.properties 文件中添加类似的内容:
country-api/mp-rest/url=https://restcountries.eu/rest
使用 Docker 它可以工作,我可以通过参数传递属性值:
docker run -it --privileged --rm --env country-api/mp-rest/url="https://restcountries.eu/rest" mydockerhost/my-project:SNAPSHOT
Kubernetes 的 YAML 文件如下所示:
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
labels:
app.kubernetes.io/name: "my-project"
app.kubernetes.io/version: "SNAPSHOT"
name: "my-project-deployment"
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: "my-project"
app.kubernetes.io/version: "SNAPSHOT"
template:
metadata:
labels:
app.kubernetes.io/name: "my-project"
app.kubernetes.io/version: "SNAPSHOT"
spec:
containers:
- env:
- name: "country-api/mp-rest/url"
value: "https://restcountries.eu/rest"
Run Code Online (Sandbox Code Playgroud)
但执行命令时出现如下错误kubectl apply -f my-projetc.yaml
The Deployment "my-project-deployment" is invalid:
* spec.template.spec.containers[0].env[1].name: Invalid value: "country-api/mp-rest/url": a valid environment variable name …
我知道你可以实施 ObjectMapperCustomizer
为 Quarkus REST 服务配置映射器。但是,Quarkus REST Client 的文档中并不清楚它是否会使用相同的(全局?)映射器。当外部服务与您自己的服务具有不同的 JSON 命名约定时,您如何处理这种情况?我找不到为 REST 客户端配置 ObjectMapper 的方法。我假设您可能可以使用 Jackson 注释来解决这个问题,但我正在寻找一种方法来仅通过配置 ObjectMapper 来实现。
所以,基本上,问题是:如何为一个特定的REST 客户端配置一个单独的ObjectMapper ?
我试图测试 vertx munity web 客户端提供的反应式 web 客户端。
我遵循了官方指南Quarkus - Getting Started with Reactive。
并在依赖项中添加了以下内容。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>
<dependency>
<groupId>io.smallrye.reactive</groupId>
<artifactId>smallrye-mutiny-vertx-web-client</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是当我Vertx
像文章中提到的那样注入时,得到了 CDI 不满意的依赖异常。Vertx
不可用。
Caused by: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type io.vertx.mutiny.core.Vertx and qualifiers [@Default]
- java member: com.example.PostResourceClient#vertx
Run Code Online (Sandbox Code Playgroud)
完整的代码在这里。
reactive-programming vert.x quarkus smallrye quarkus-rest-client
我正在使用 quarkus.rest-client 调用外部 API,并希望将这些调用的频率限制为每秒 50 次,这样我就不会淹没外部服务。在没有 side-car 方法(通过代码)的情况下实现这一目标的推荐方法是什么?
我想从两个不同的sql表中获取两个值。
在sql中,我们会执行“从A a内连接B b上选择a.value,b.value,a.id = b.id,其中...”
有可能以华丽的方式做到这一点吗?比如加入两个实体或类似的东西?
确实找不到太多关于与 quarkus panache 进行连接的信息。
我正在尝试在我拥有的另一项服务上执行请求。我用来创建应用程序的指南是:
我收到如下错误:
org.jboss.resteasy.spi.UnhandledException: java.lang.RuntimeException: Error injecting com.easy.ecomm.core.product.ProductClient com.easy.ecomm.core.cart.CartService.productClient
org.eclipse.microprofile.rest.client.RestClientDefinitionException: Parameters and variables don't match on interface com.easy.ecomm.core.product.ProductClient::findProductById
Run Code Online (Sandbox Code Playgroud)
这是 ProductClient 类
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
@Path("products")
@RegisterRestClient(configKey = "products-api")
public interface ProductClient {
@GET
@Path("{id}")
Product findProductById(String id);
}
Run Code Online (Sandbox Code Playgroud)
这是服务层:
import org.eclipse.microprofile.rest.client.inject.RestClient;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
@ApplicationScoped
public class CartService {
@Inject
@RestClient
ProductClient productClient;
public void addItem(String cartId, String productId, Integer amount){
// Code to find the cart on a …
Run Code Online (Sandbox Code Playgroud) 我有一个服务公开了许多 Jax-RS 接口。我现在想使用这些接口来连接服务。我正在使用 Quarkus,这意味着我正在使用 microprofile Rest 客户端。因为我已经有了 JaxRS 接口,所以使用 @RegisterRestClient 方法并不是真正可行。相反,我使用 RestClientBuilder。
MyService client = RestClientBuilder.newBuilder()
.baseUri(URI.create("https://localhost:8080"))
.build(MyService.class);
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是身份验证。我需要访问的服务被锁定在基本身份验证后面。我找到的所有关于 microprofile REST 客户端的指南都是这个的变体版本的变体,其中解决方案是添加 headerparam。但这是不可能的,因为我已经预先制作了界面,并且复制粘贴整个内容来添加标头参数确实是我宁愿避免的事情。
还应该提到的是,我尝试过使用 @Provider 过滤器来设置标头,但我似乎无法弄清楚如何使用该方法仅针对单个 REST 客户端,而且我有几个。
那么:如何使用 microprofile Rest 客户端设置基本身份验证而不干扰 Jax-Rs 接口本身?
我实现了一个最小的 Quarkus RestClient,非常类似于文档中的示例(https://quarkus.io/guides/rest-client):
package org.acme.rest.client;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import org.jboss.resteasy.annotations.jaxrs.PathParam;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import java.util.Set;
@Path("/v2")
@RegisterRestClient
public interface CountriesService {
@GET
@Path("/name/{name}")
Set<Country> getByName(@PathParam String name);
}
Run Code Online (Sandbox Code Playgroud)
如何为上述客户端的所有调用启用日志记录?
我需要显示完整的 URI、查询参数和 HTTP 响应代码,即使后者显示在单独的行上。
quarkus ×9
java ×4
cdi ×1
httprequest ×1
jackson ×1
junit ×1
kubernetes ×1
logging ×1
microprofile ×1
openapi ×1
rest ×1
resteasy ×1
smallrye ×1
vert.x ×1
yaml ×1