从 vert.web.ext context.request() 获取 HttpServletRequest

问题描述 投票:0回答:1

我可能会问类似的问题

是否可以互相翻译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 
servlets jax-rs vert.x
1个回答
0
投票

没有开箱即用的方法 - 你必须自己编写两者之间的适配器。这是一个起点

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
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.