我正在将旧的Quarkus项目从RESTEasy迁移到ResteasyReactive,我在迁移ResteasyContext.pushContext
时遇到了一些困难,因为REST Easy中没有真正的1:1替代方案.
我使用ContainerRequestFilter
中的ResteasyContext.pushContext
将一些自定义对象推送到上下文,然后使用@Context检索它.
类似于我提供的这个最小示例中的内容.
过滤器:
package org.acme.filter;
import org.acme.pojo.CustomHttpRequest;
import org.jboss.resteasy.core.ResteasyContext;
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;
import java.time.LocalDateTime;
import java.util.Random;
@Provider
@ApplicationScoped
public class HttpRequestFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) {
CustomHttpRequest request = CustomHttpRequest.builder()
.headers(requestContext.getHeaders())
.dateTime(LocalDateTime.now())
.text("Some random text for example " + new Random().nextInt(100))
.build();
ResteasyContext.pushContext(CustomHttpRequest.class, request);
}
}
我要推送到上下文的自定义对象:
package org.acme.pojo;
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;
import javax.ws.rs.core.MultivaluedMap;
import java.time.LocalDateTime;
@Getter
@Builder
@ToString
public class CustomHttpRequest {
private String text;
private LocalDateTime dateTime;
private MultivaluedMap<String, String> headers;
private boolean secured;
}
后者从我的REST端点的上下文中读取它:
package org.acme;
import org.acme.pojo.CustomHttpRequest;
import org.acme.pojo.ResponseData;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class GreetingResource {
@GET
@Path("{pathText}")
@Produces(MediaType.APPLICATION_JSON)
public ResponseData testContext(@Context CustomHttpRequest httpRequest,
@PathParam("pathText") String querryText) {
return ResponseData.builder()
.querryText(querryText)
.httpRequestText(httpRequest.getText())
.secured(httpRequest.isSecured())
.build();
}
}
以下是GitHub上的完整示例:https://github.com/pkristja/resteasy_context/tree/main
我发现了一些使用RestEasyReactive的替代方案,比如使用ContainerRequestContext
并使用setProperty设置数据.
生成文件更改:
从implementation("io.quarkus:quarkus-resteasy-jackson")
更改为implementation("io.quarkus:quarkus-resteasy-reactive-jackson")
用于将对象设置为上下文的筛选器:
package org.acme.filter;
import org.acme.pojo.CustomHttpRequest;
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.Provider;
import java.time.LocalDateTime;
import java.util.Random;
@Provider
@ApplicationScoped
public class HttpRequestFilter implements ContainerRequestFilter {
@Context
ContainerRequestContext crContext;
@Override
public void filter(ContainerRequestContext requestContext) {
CustomHttpRequest request = CustomHttpRequest.builder()
.headers(requestContext.getHeaders())
.dateTime(LocalDateTime.now())
.text("Some random text for example " + new Random().nextInt(100))
.build();
crContext.setProperty("customHttpRequest", request);
}
}
正在从上下文中检索对象:
package org.acme;
import org.acme.pojo.CustomHttpRequest;
import org.acme.pojo.ResponseData;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class GreetingResource {
@GET
@Path("{pathText}")
@Produces(MediaType.APPLICATION_JSON)
public ResponseData testContext(@Context ContainerRequestContext crContext,
@PathParam("pathText") String querryText) {
CustomHttpRequest httpRequest = (CustomHttpRequest) crContext.getProperty("customHttpRequest");
return ResponseData.builder()
.querryText(querryText)
.httpRequestText(httpRequest.getText())
.secured(httpRequest.isSecured())
.build();
}
}
有没有办法像您在使用ResteasyContext.pushContext
的RestEasyReactive中那样在RestEasyReactive中获得相同的功能,因为从上下文中检索每个对象并强制转换它是非常繁琐和低效的,因为在我的真实示例中,我使用ResteasyContext.pushContext
将多个自定义对象推送到上下文中.
谢谢!