我可能会问类似的问题
是否可以互相翻译ServerHttpRequest和HttpServletRequest
我有一个旧的第 3 方 jar 库(无源代码),它接受/期望类型为 javax.servlet.http.HttpServletRequest 的请求;
阅读 vert.x http api 是 jax-rs 库的包装器(可能是错误的)
从 vert.x context.request() 获取 javax.servlet.http.HttpServletRequest 的最佳方法是什么?
在任何人问之前:是的,第 3 方 jar 操纵标头,但我们不想重写整个 jar 库;如果 @Context 工作,但没有工作)
非常感谢!
java.lang.ClassCastException: class io.vertx.ext.web.impl.HttpServerRequestWrapper cannot be cast to class javax.servlet.http.HttpServletRequest (io.vertx.ext.web.impl.HttpServerRequestWrapper and javax.servlet.http.HttpServletRequest are in unnamed module of loader
没有开箱即用的方法 - 你必须自己编写两者之间的适配器。这是一个起点
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.http.HttpServerRequest;
public class VertxToJaxRsConverter {
public static HttpServletRequest convert(HttpServerRequest vertxRequest) {
// Extract information from the Vert.x Web request
HttpMethod method = vertxRequest.method();
String uri = vertxRequest.uri();
MultivaluedMap<String, String> headers = new MultivaluedHashMap<>();
vertxRequest.headers().forEach(entry -> headers.add(entry.getKey(), entry.getValue()));
String contentType = headers.getFirst(HttpHeaders.CONTENT_TYPE);
byte[] bodyBytes = vertxRequest.getBody().getBytes();
// Create a new JAX-RS servlet request object
HttpServletRequest jaxrsRequest = new VertxHttpServletRequest(method.name(), uri, headers);
// Set the content type header based on the Vert.x Web request's content type
if (contentType != null) {
jaxrsRequest.setContentType(contentType);
}
// Set the body of the JAX-RS servlet request object based on the Vert.x Web request's body
jaxrsRequest.setContent(bodyBytes);
return jaxrsRequest;
}
private static class VertxHttpServletRequest implements HttpServletRequest {
private final String method;
private final String requestURI;
private final MultivaluedMap<String, String> headers;
private byte[] content;
public VertxHttpServletRequest(String method, String requestURI, MultivaluedMap<String, String> headers) {
this.method = method;
this.requestURI = requestURI;
this.headers = headers;
}
@Override
public String getMethod() {
return method;
}
@Override
public String getRequestURI() {
return requestURI;
}
@Override
public String getContentType() {
return headers.getFirst(HttpHeaders.CONTENT_TYPE);
}
@Override
public int getContentLength() {
return content != null ? content.length : -1;
}
@Override
public String getHeader(String name) {
return headers.getFirst(name);
}
@Override
public Enumeration<String> getHeaderNames() {
return headers.keySet().stream().sorted().collect(Collectors.enumeration());
}
@Override
public Enumeration<String> getHeaders(String name) {
return headers.get(name).stream().sorted().collect(Collectors.enumeration());
}
@Override
public ServletInputStream getInputStream() throws IOException {
return new ServletInputStream() {
private final ByteArrayInputStream inputStream = new ByteArrayInputStream(content);
@Override
public int read() throws IOException {
return inputStream.read();
}
};
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream(), StandardCharsets.UTF_8));
}
public void setContent(byte[] content) {
this.content = content;
}
// Other methods omitted for brevity
}
}