代码之家  ›  专栏  ›  技术社区  ›  Oleg Pavliv

转储错误请求

  •  0
  • Oleg Pavliv  · 技术社区  · 7 年前

    我有一个用Dropwizard实现的服务,我需要把不正确的请求转储到某个地方。

    我看到有一个 possibility 通过注册自定义错误消息 ExceptionMapper<JerseyViolationException> . 但我需要有完整的请求(头,正文),而不仅仅是 ConstraintViolations

    1 回复  |  直到 7 年前
        1
  •  3
  •   Leisetreter Paul Samsotha    6 年前

    你可以注射 ContainerRequest ExceptionMapper javax.inject.Provider

    @Provider
    public class Mapper implements ExceptionMapper<ConstraintViolationException> {
        
        @Inject
        private javax.inject.Provider<ContainerRequest> requestProvider;
    
        @Override
        public Response toResponse(ConstraintViolationException ex) {
            ContainerRequest request = requestProvider.get();
        }
    }
    

    (这也适用于构造函数参数注入,而不是字段注入。)

    在 容器请求 ,您可以使用 getHeaderString() 或 getHeaders() . 如果你想得到主体,你需要做一点小的修改,因为实体流已经被Jersey在mapper到达时读取了。所以我们需要实施 ContainerRequestFilter 缓冲实体。

    public class EntityBufferingFilter implements ContainerRequestFilter {
    
        @Override
        public void filter(ContainerRequestContext containerRequestContext) throws IOException {
            ContainerRequest request = (ContainerRequest) containerRequestContext;
            request.bufferEntity();
        }
    }
    

    全部的 DynamicFeature 只在使用bean验证(或 Name Binding

    一旦注册了这个过滤器,就可以使用 ContainerRequest#readEntity(Class) . 使用这种方法就像在客户端使用 Response#readEntity() . 所以对于类,如果你想保持它的泛型,你可以使用 String.class InputStream.class InputStream 一根绳子。

    ContainerRequest request = requestProvider.get();
    String body = request.readEntity(String.class);
    
    推荐文章