Jersey config report

Report shows all registered jersey extensions, including registered by dropwizard and all manual registrations.

GuiceBundle.builder()
    ...
    .printJerseyConfig() 
    .build()

Example report:

INFO  [2019-10-28 06:16:44,068] ru.vyarus.dropwizard.guice.debug.JerseyConfigDiagnostic: Jersey configuration = 

    Exception mappers
        Throwable                      ExceptionMapperBinder$1      (io.dropwizard.setup)      
        EofException                   EarlyEofExceptionMapper      (i.d.jersey.errors)        
        EmptyOptionalException         EmptyOptionalExceptionMapper (i.d.jersey.optional)      
        IOException                    GuiceExceptionMapper         (r.v.d.g.c.h.support)      
        IOException                    HKExceptionMapper            (r.v.d.g.c.h.s.hk)         *jersey managed
        IllegalStateException          IllegalStateExceptionMapper  (i.d.jersey.errors)        
        JerseyViolationException       JerseyViolationExceptionMapper (i.d.j.validation)         
        JsonProcessingException        JsonProcessingExceptionMapper (i.d.jersey.jackson)       
        ValidationException            ValidationExceptionMapper    (o.g.j.s.v.internal)       

    Param converters
        AbstractParamConverterProvider (i.d.jersey.params)        
        FuzzyEnumParamConverterProvider (i.d.j.validation)         
        GuiceParamConverterProvider  (r.v.d.g.c.h.support)      
        HKParamConverterProvider     (r.v.d.g.c.h.s.hk)         *jersey managed
        RootElementProvider          (o.g.j.j.i.JaxbStringReaderProvider) 
        OptionalDoubleParamConverterProvider (i.d.jersey.optional)      
        OptionalIntParamConverterProvider (i.d.jersey.optional)      
        OptionalLongParamConverterProvider (i.d.jersey.optional)      
        OptionalParamConverterProvider (i.d.jersey.guava)         
        OptionalParamConverterProvider (i.d.jersey.optional)      
        AggregatedProvider           (o.g.j.i.i.ParamConverters) 

    Context resolvers
        Context                        GuiceContextResolver         (r.v.d.g.c.h.support)      
        Context                        HKContextResolver            (r.v.d.g.c.h.s.hk)         *jersey managed

    Message body readers
        Object                         BasicTypesMessageProvider    (o.g.j.m.internal)                       [text/plain]
        byte[]                         ByteArrayProvider            (o.g.j.m.internal)                       [application/octet-stream, */*]
        DataSource                     DataSourceProvider           (o.g.j.m.internal)                       [application/octet-stream, */*]
        Document                       DocumentProvider             (o.g.j.jaxb.internal)                    [application/xml, text/xml, */*]
        File                           FileProvider                 (o.g.j.m.internal)                       [application/octet-stream, */*]
        MultivaluedMap<String, String> FormMultivaluedMapProvider   (o.g.j.m.internal)                       [application/x-www-form-urlencoded]
        Form                           FormProvider                 (o.g.j.m.internal)                       [application/x-www-form-urlencoded, */*]
        Type                           GuiceMessageBodyReader       (r.v.d.g.c.h.support)                    
        Type                           HKMessageBodyReader          (r.v.d.g.c.h.s.hk)         *jersey managed 
        InputStream                    InputStreamProvider          (o.g.j.m.internal)                       [application/octet-stream, */*]
        Object                         JacksonJsonProvider          (c.f.j.jaxrs.json)                       [*/*]
        Object                         JacksonMessageBodyProvider   (i.d.jersey.jackson)                     [*/*]
        Reader                         ReaderProvider               (o.g.j.m.internal)                       [text/plain, */*]
        RenderedImage                  RenderedImageProvider        (o.g.j.m.internal)                       [image/*, application/octet-stream]
        StreamSource                   StreamSourceReader           (o.g.j.m.i.SourceProvider)               [application/xml, text/xml, */*]
        SAXSource                      SaxSourceReader              (o.g.j.m.i.SourceProvider)               [application/xml, text/xml, */*]
        DOMSource                      DomSourceReader              (o.g.j.m.i.SourceProvider)               [application/xml, text/xml, */*]
        String                         StringMessageProvider        (o.g.j.m.internal)                       [text/plain, */*]
        T[], Collection<T>             App                          (o.g.j.j.i.XmlCollectionJaxbProvider)    [application/xml]
        T[], Collection<T>             Text                         (o.g.j.j.i.XmlCollectionJaxbProvider)    [text/xml]
        T[], Collection<T>             General                      (o.g.j.j.i.XmlCollectionJaxbProvider)    [*/*]
        JAXBElement<Object>            App                          (o.g.j.j.i.XmlJaxbElementProvider)       [application/xml]
        JAXBElement<Object>            Text                         (o.g.j.j.i.XmlJaxbElementProvider)       [text/xml]
        JAXBElement<Object>            General                      (o.g.j.j.i.XmlJaxbElementProvider)       [*/*,*/*+xml]
        Object                         App                          (o.g.j.j.i.XmlRootElementJaxbProvider)   [application/xml]
        Object                         Text                         (o.g.j.j.i.XmlRootElementJaxbProvider)   [text/xml]
        Object                         General                      (o.g.j.j.i.XmlRootElementJaxbProvider)   [*/*]
        Object                         App                          (o.g.j.j.i.XmlRootObjectJaxbProvider)    [application/xml]
        Object                         Text                         (o.g.j.j.i.XmlRootObjectJaxbProvider)    [text/xml]
        Object                         General                      (o.g.j.j.i.XmlRootObjectJaxbProvider)    [*/*]

    Message body writers
        Object                         BasicTypesMessageProvider    (o.g.j.m.internal)                       [text/plain]
        byte[]                         ByteArrayProvider            (o.g.j.m.internal)                       [application/octet-stream, */*]
        ChunkedOutput<Object>          ChunkedResponseWriter        (o.g.jersey.server)                      
        DataSource                     DataSourceProvider           (o.g.j.m.internal)                       [application/octet-stream, */*]
        Document                       DocumentProvider             (o.g.j.jaxb.internal)                    [application/xml, text/xml, */*]
        File                           FileProvider                 (o.g.j.m.internal)                       [application/octet-stream, */*]
        MultivaluedMap<String, String> FormMultivaluedMapProvider   (o.g.j.m.internal)                       [application/x-www-form-urlencoded]
        Form                           FormProvider                 (o.g.j.m.internal)                       [application/x-www-form-urlencoded, */*]
        Type                           GuiceMessageBodyWriter       (r.v.d.g.c.h.support)                    
        Type                           HKMessageBodyWriter          (r.v.d.g.c.h.s.hk)         *jersey managed 
        InputStream                    InputStreamProvider          (o.g.j.m.internal)                       [application/octet-stream, */*]
        Object                         JacksonJsonProvider          (c.f.j.jaxrs.json)                       [*/*]
        Object                         JacksonMessageBodyProvider   (i.d.jersey.jackson)                     [*/*]
        OptionalDouble                 OptionalDoubleMessageBodyWriter (i.d.jersey.optional)                 [*/*]
        OptionalInt                    OptionalIntMessageBodyWriter (i.d.jersey.optional)                    [*/*]
        OptionalLong                   OptionalLongMessageBodyWriter (i.d.jersey.optional)                   [*/*]
        Optional<Object>               OptionalMessageBodyWriter    (i.d.jersey.guava)                       [*/*]
        Optional<Object>               OptionalMessageBodyWriter    (i.d.jersey.optional)                    [*/*]
        Reader                         ReaderProvider               (o.g.j.m.internal)                       [text/plain, */*]
        RenderedImage                  RenderedImageProvider        (o.g.j.m.internal)                       [image/*]
        Source                         SourceWriter                 (o.g.j.m.i.SourceProvider)               [application/xml, text/xml, */*]
        StreamingOutput                StreamingOutputProvider      (o.g.j.m.internal)                       [application/octet-stream, */*]
        String                         StringMessageProvider        (o.g.j.m.internal)                       [text/plain, */*]
        Object                         ValidationErrorMessageBodyWriter (o.g.j.s.v.internal)                 
        T[], Collection<T>             App                          (o.g.j.j.i.XmlCollectionJaxbProvider)    [application/xml]
        T[], Collection<T>             Text                         (o.g.j.j.i.XmlCollectionJaxbProvider)    [text/xml]
        T[], Collection<T>             General                      (o.g.j.j.i.XmlCollectionJaxbProvider)    [*/*]
        JAXBElement<Object>            App                          (o.g.j.j.i.XmlJaxbElementProvider)       [application/xml]
        JAXBElement<Object>            Text                         (o.g.j.j.i.XmlJaxbElementProvider)       [text/xml]
        JAXBElement<Object>            General                      (o.g.j.j.i.XmlJaxbElementProvider)       [*/*,*/*+xml]
        Object                         App                          (o.g.j.j.i.XmlRootElementJaxbProvider)   [application/xml]
        Object                         Text                         (o.g.j.j.i.XmlRootElementJaxbProvider)   [text/xml]
        Object                         General                      (o.g.j.j.i.XmlRootElementJaxbProvider)   [*/*]

    Reader interceptors
        MappableExceptionWrapperInterceptor (o.g.j.s.internal)         
        GuiceReaderInterceptor       (r.v.d.g.c.h.support)      
        HKReaderInterceptor          (r.v.d.g.c.h.s.hk)         *jersey managed

    Writer interceptors
        MappableExceptionWrapperInterceptor (o.g.j.s.internal)         
        JsonWithPaddingInterceptor   (o.g.j.s.internal)         
        GuiceWriterInterceptor       (r.v.d.g.c.h.support)      
        HKWriterInterceptor          (r.v.d.g.c.h.s.hk)         *jersey managed

    Container request filters
        GuiceContainerRequestFilter  (r.v.d.g.c.h.support)      
        HKContainerRequestFilter     (r.v.d.g.c.h.s.hk)         *jersey managed

    Container response filters
        GuiceContainerResponseFilter (r.v.d.g.c.h.support)      
        HKContainerResponseFilter    (r.v.d.g.c.h.s.hk)         *jersey managed

    Dynamic features
        CacheControlledResponseFeature (i.d.jersey.caching)       
        GuiceDynamicFeature          (r.v.d.g.c.h.support)      
        HKDynamicFeature             (r.v.d.g.c.h.s.hk)         *jersey managed

    Param value providers
        AsyncResponseValueParamProvider (o.g.j.s.i.inject)         
        BeanParamValueParamProvider  (o.g.j.s.i.inject)         
        CookieParamValueParamProvider (o.g.j.s.i.inject)         
        DelegatedInjectionValueParamProvider (o.g.j.s.i.inject)         
        EntityParamValueParamProvider (o.g.j.s.i.inject)         
        FormParamValueParamProvider  (o.g.j.s.i.inject)         
        GuiceValueParamProvider      (r.v.d.g.c.h.support)      
        HKValueParamProvider         (r.v.d.g.c.h.s.hk)         *jersey managed
        HeaderParamValueParamProvider (o.g.j.s.i.inject)         
        MatrixParamValueParamProvider (o.g.j.s.i.inject)         
        PathParamValueParamProvider  (o.g.j.s.i.inject)         
        QueryParamValueParamProvider (o.g.j.s.i.inject)         
        SessionFactoryProvider       (i.d.jersey.sessions)      
        WebTargetValueParamProvider  (o.g.j.s.i.inject)         

    Injection resolvers
        @Context                        ContextInjectionResolverImpl (o.g.j.inject.hk2)         
        @Ann                            GuiceInjectionResolver       (r.v.d.g.c.h.support)      
        @Ann                            HKInjectionResolver          (r.v.d.g.c.h.s.hk)         *jersey managed
        @Suspended                      ParamInjectionResolver       (o.g.j.s.i.inject)          using AsyncResponseValueParamProvider 
        @CookieParam                    ParamInjectionResolver       (o.g.j.s.i.inject)          using CookieParamValueParamProvider 
        @FormParam                      ParamInjectionResolver       (o.g.j.s.i.inject)          using FormParamValueParamProvider 
        @HeaderParam                    ParamInjectionResolver       (o.g.j.s.i.inject)          using HeaderParamValueParamProvider 
        @MatrixParam                    ParamInjectionResolver       (o.g.j.s.i.inject)          using MatrixParamValueParamProvider 
        @PathParam                      ParamInjectionResolver       (o.g.j.s.i.inject)          using PathParamValueParamProvider 
        @QueryParam                     ParamInjectionResolver       (o.g.j.s.i.inject)          using QueryParamValueParamProvider 
        @Uri                            ParamInjectionResolver       (o.g.j.s.i.inject)          using WebTargetValueParamProvider 
        @BeanParam                      ParamInjectionResolver       (o.g.j.s.i.inject)          using BeanParamValueParamProvider 

Warning

Items in each section are sorted according to @Priority annotation and then by name. So explicitly prioritized beans will go upper, but beans with the same priority will be ordered by name. Of course jersey itself may prioritize differently, but report must be consistent (always show the same order) - so it's unavoidable trade off.

Common markers

Markers are shown at the end of extension line. The following markers are common for all extension types.

Filter

Jersey extension scope may be reduced with @NameBinding annotation. Custom annotation may be created (declared as @NameBinding):

@NameBinding
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface FilterAnn {}

Now if extension will be annotated with it:

@Provider
@FilterAnn
public class ExMapper implements ExceptionMapper<IOException> {}

Will be applied only to resources, annotated with @FilterAnn.

Report will identify scoped extensions with marker:

IOException                    ExMapper                     (r.v.d.g.d.r.j.FilterMarkerRenderTest) *only @FilterAnn

Lazy

Extensions annotated with @LazyBinding are identified with marker:

IOException                    ExMapper                     (r.v.d.g.d.r.j.LazyRenderTest) *lazy

Jersey managed

Extensions, managed by HK2 are also identified with marker:

@Ann                            HKInjectionResolver          (r.v.d.g.c.h.s.hk)         *jersey managed

Exception mappers

Extended exception mappers (these mappers may decide if they accept exception handling):

@Provider
public class ExtMapper implements ExtendedExceptionMapper<IOException> {
    @Override
    public boolean isMappable(IOException exception) {
        return false;
    }

    @Override
    public Response toResponse(IOException exception) {
        return null;
    }
}

Are identified in report:

OException                    ExtMapper                    (r.v.d.g.d.r.j.ExtendedExceptionMapperRenderTest) *extended

Report customization

Report is implemented as guicey event listener and provide additional customization options, so if default configuration (from shortcut methods above) does not fit your needs you can register listener directly with required configuration.

For example, to show only exception mappers:

listen(new JerseyConfigDiagnostic(new JerseyConfig()
                    .showExceptionMappers()))

Report rendering logic may also be used directly as report provide separate renderer object implementing ReportRenderer. Renderer not bound to guice context and assume direct instantiation.