Class ProviderBase<THIS extends ProviderBase<THIS,MAPPER,EP_CONFIG,MAPPER_CONFIG>,MAPPER extends com.fasterxml.jackson.databind.ObjectMapper,EP_CONFIG extends EndpointConfigBase<EP_CONFIG>,MAPPER_CONFIG extends MapperConfiguratorBase<MAPPER_CONFIG,MAPPER>>
java.lang.Object
org.glassfish.jersey.jackson.internal.jackson.jaxrs.base.ProviderBase<THIS,MAPPER,EP_CONFIG,MAPPER_CONFIG>
- All Implemented Interfaces:
com.fasterxml.jackson.core.Versioned
,MessageBodyReader<Object>
,MessageBodyWriter<Object>
- Direct Known Subclasses:
JacksonJsonProvider
public abstract class ProviderBase<THIS extends ProviderBase<THIS,MAPPER,EP_CONFIG,MAPPER_CONFIG>,MAPPER extends com.fasterxml.jackson.databind.ObjectMapper,EP_CONFIG extends EndpointConfigBase<EP_CONFIG>,MAPPER_CONFIG extends MapperConfiguratorBase<MAPPER_CONFIG,MAPPER>>
extends Object
implements MessageBodyReader<Object>, MessageBodyWriter<Object>, com.fasterxml.jackson.core.Versioned
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected boolean
Whether we want to actually check that Jackson has a deserializer for given type.protected boolean
Whether we want to actually check that Jackson has a serializer for given type.Map that contains overrides to default list of untouchable types:true
meaning that entry is untouchable,false
that is is not.protected Class<?>
View to use for reading if none defined for the end point.protected Class<?>
View to use for writing if none defined for the end point.protected int
Feature flags set.protected final MAPPER_CONFIG
Helper object used for encapsulating configuration aspects ofObjectMapper
protected final com.fasterxml.jackson.databind.util.LookupCache<AnnotationBundleKey,
EP_CONFIG> Cache for resolved endpoint configurations when reading JSON datastatic final Class<?>[]
static final Class<?>[]
protected final com.fasterxml.jackson.databind.util.LookupCache<AnnotationBundleKey,
EP_CONFIG> Cache for resolved endpoint configurations when writing JSON dataprotected static final String
static final Class<?>[]
These are classes that we never use for reading (never try to deserialize instances of these types).Looks like we need to worry about accidental data binding for types we shouldn't be handling.static final Class<?>[]
These are classes that we never use for writing (never try to serialize instances of these types).static final String
This header is useful on Windows, trying to deal with potential XSS attacks.protected static final int
-
Constructor Summary
ConstructorsModifierConstructorDescriptionprotected
Deprecated.protected
ProviderBase
(MAPPER_CONFIG mconfig) protected
ProviderBase
(MAPPER_CONFIG mconfig, com.fasterxml.jackson.databind.util.LookupCache<AnnotationBundleKey, EP_CONFIG> readerCache, com.fasterxml.jackson.databind.util.LookupCache<AnnotationBundleKey, EP_CONFIG> writerCache) -
Method Summary
Modifier and TypeMethodDescriptionprotected static void
_addSuperTypes
(Class<?> cls, Class<?> endBefore, Collection<Class<?>> result, boolean addClassItself) protected abstract EP_CONFIG
_configForReading
(com.fasterxml.jackson.databind.ObjectReader reader, Annotation[] annotations) protected EP_CONFIG
_configForReading
(MAPPER mapper, Annotation[] annotations, Class<?> defaultView) protected abstract EP_CONFIG
_configForWriting
(com.fasterxml.jackson.databind.ObjectWriter writer, Annotation[] annotations) protected EP_CONFIG
_configForWriting
(MAPPER mapper, Annotation[] annotations, Class<?> defaultView) protected static boolean
_containedIn
(Class<?> mainType, HashSet<ClassKey> set) protected com.fasterxml.jackson.core.JsonGenerator
_createGenerator
(com.fasterxml.jackson.databind.ObjectWriter writer, OutputStream rawStream, com.fasterxml.jackson.core.JsonEncoding enc) Overridable helper method called to create aJsonGenerator
for writing contents into given rawOutputStream
.protected IOException
protected com.fasterxml.jackson.core.JsonParser
_createParser
(com.fasterxml.jackson.databind.ObjectReader reader, InputStream rawStream) Overridable helper method called to create aJsonParser
for reading contents of given rawInputStream
.protected EP_CONFIG
_endpointForReading
(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders) Overridable helper method that will basically fetch representation of the endpoint that can be used to getObjectReader
to use for deserializing contentprotected EP_CONFIG
_endpointForWriting
(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders) protected Boolean
_findCustomUntouchable
(Class<?> mainType) protected boolean
_isIgnorableForReading
(ClassKey typeKey) Overridable helper method called to check whether given type is a known "ignorable type" (in context of reading), values of which are not bound from content.protected boolean
_isIgnorableForWriting
(ClassKey typeKey) Overridable helper method called to check whether given type is a known "ignorable type" (in context of reading), values of which can not be written out.protected boolean
_isSpecialReadable
(Class<?> type) Overridable helper method used to allow handling of somewhat special types for readingprotected abstract MAPPER
_locateMapperViaProvider
(Class<?> type, MediaType mediaType) Helper method that is called if no mapper has been explicitly configured.protected void
_modifyHeaders
(Object value, Class<?> type, Type genericType, Annotation[] annotations, MultivaluedMap<String, Object> httpHeaders, EP_CONFIG endpoint) Overridable method used for adding optional response headers before serializing response object.void
addUntouchable
(Class<?> type) Method for marking specified type as "untouchable", meaning that provider will not try to read or write values of this type (or its subtypes).void
checkCanDeserialize
(boolean state) Method for defining whether actual detection for existence of a deserializer for type should be done whenisReadable(java.lang.Class<?>, java.lang.reflect.Type, java.lang.annotation.Annotation[], jakarta.ws.rs.core.MediaType)
is called.void
checkCanSerialize
(boolean state) Method for defining whether actual detection for existence of a serializer for type should be done whenisWriteable(java.lang.Class<?>, java.lang.reflect.Type, java.lang.annotation.Annotation[], jakarta.ws.rs.core.MediaType)
is called.configure
(com.fasterxml.jackson.core.JsonGenerator.Feature f, boolean state) configure
(com.fasterxml.jackson.core.JsonParser.Feature f, boolean state) configure
(com.fasterxml.jackson.databind.DeserializationFeature f, boolean state) configure
(com.fasterxml.jackson.databind.SerializationFeature f, boolean state) configure
(JaxRSFeature feature, boolean state) disable
(com.fasterxml.jackson.core.JsonGenerator.Feature f) disable
(com.fasterxml.jackson.core.JsonParser.Feature f) disable
(com.fasterxml.jackson.databind.DeserializationFeature f) disable
(com.fasterxml.jackson.databind.SerializationFeature f) disable
(JaxRSFeature feature) disable
(JaxRSFeature first, JaxRSFeature... f2) enable
(com.fasterxml.jackson.core.JsonGenerator.Feature f) enable
(com.fasterxml.jackson.core.JsonParser.Feature f) enable
(com.fasterxml.jackson.databind.DeserializationFeature f) enable
(com.fasterxml.jackson.databind.SerializationFeature f) enable
(JaxRSFeature feature) enable
(JaxRSFeature first, JaxRSFeature... f2) protected com.fasterxml.jackson.core.JsonEncoding
findEncoding
(MediaType mediaType, MultivaluedMap<String, Object> httpHeaders) Helper method to use for determining desired output encoding.findSuperTypes
(Class<?> cls, Class<?> endBefore) findSuperTypes
(Class<?> cls, Class<?> endBefore, List<Class<?>> result) long
getSize
(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) Method that JAX-RS container calls to try to figure out serialized length of given value.protected abstract boolean
hasMatchingMediaType
(MediaType mediaType) Helper method used to check whether given media type is supported by this provider.protected boolean
hasMatchingMediaTypeForReading
(MediaType mediaType) Helper method used to check whether given media type is supported by this provider for read operations (when binding input data such as POST body).protected boolean
hasMatchingMediaTypeForWriting
(MediaType mediaType) Helper method used to check whether given media type is supported by this provider for writing operations, such as when converting response object to response body of request (like GET or POST).boolean
boolean
isReadable
(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) Method that JAX-RS container calls to try to check whether values of given type (and media type) can be deserialized by this provider.boolean
isWriteable
(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) Method that JAX-RS container calls to try to check whether given value (of specified type) can be serialized by this provider.locateMapper
(Class<?> type, MediaType mediaType) Method called to locateObjectMapper
to use for serialization and deserialization.readFrom
(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) Method that JAX-RS container calls to deserialize given value.void
removeUntouchable
(Class<?> type) Method for removing definition of specified type as untouchable: usually onlyvoid
setAnnotationsToUse
(Annotations[] annotationsToUse) Method for configuring which annotation sets to use (including none).setDefaultReadView
(Class<?> view) Method for specifying JSON View to use for reading content when end point does not have explicit View annotations.setDefaultView
(Class<?> view) Method for specifying JSON View to use for reading and writing content when end point does not have explicit View annotations.setDefaultWriteView
(Class<?> view) Method for specifying JSON View to use for reading content when end point does not have explicit View annotations.void
Method that can be used to directly defineObjectMapper
to use for serialization and deserialization; if null, will use the standard provider discovery from context instead.void
writeTo
(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) Method that JAX-RS container calls to serialize given value.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface com.fasterxml.jackson.core.Versioned
version
-
Field Details
-
HEADER_CONTENT_TYPE_OPTIONS
This header is useful on Windows, trying to deal with potential XSS attacks.- See Also:
-
CLASS_NAME_NO_CONTENT_EXCEPTION
- See Also:
-
DEFAULT_UNTOUCHABLES
Looks like we need to worry about accidental data binding for types we shouldn't be handling. This is probably not a very good way to do it, but let's start by blacklisting things we are not to handle.(why ClassKey? since plain old Class has no hashCode() defined, lookups are painfully slow)
-
DEFAULT_UNREADABLES
These are classes that we never use for reading (never try to deserialize instances of these types). -
DEFAULT_UNWRITABLES
These are classes that we never use for writing (never try to serialize instances of these types). -
JAXRS_FEATURE_DEFAULTS
protected static final int JAXRS_FEATURE_DEFAULTS -
_mapperConfig
Helper object used for encapsulating configuration aspects ofObjectMapper
-
_cfgCustomUntouchables
Map that contains overrides to default list of untouchable types:true
meaning that entry is untouchable,false
that is is not. -
_cfgCheckCanSerialize
protected boolean _cfgCheckCanSerializeWhether we want to actually check that Jackson has a serializer for given type. Since this should generally be the case (due to auto-discovery) and since the call to check availability can be bit expensive, defaults to false. -
_cfgCheckCanDeserialize
protected boolean _cfgCheckCanDeserializeWhether we want to actually check that Jackson has a deserializer for given type. Since this should generally be the case (due to auto-discovery) and since the call to check availability can be bit expensive, defaults to false. -
_jaxRSFeatures
protected int _jaxRSFeaturesFeature flags set.- Since:
- 2.3
-
_defaultReadView
View to use for reading if none defined for the end point. -
_defaultWriteView
View to use for writing if none defined for the end point. -
_untouchables
-
_unreadableClasses
-
_unwritableClasses
-
_readers
protected final com.fasterxml.jackson.databind.util.LookupCache<AnnotationBundleKey,EP_CONFIG extends EndpointConfigBase<EP_CONFIG>> _readersCache for resolved endpoint configurations when reading JSON data -
_writers
protected final com.fasterxml.jackson.databind.util.LookupCache<AnnotationBundleKey,EP_CONFIG extends EndpointConfigBase<EP_CONFIG>> _writersCache for resolved endpoint configurations when writing JSON data
-
-
Constructor Details
-
ProviderBase
-
ProviderBase
Deprecated.Constructor that is only added to resolve [jaxrs-providers#10]; problems with combination of RESTeasy and CDI. Should NOT be used by any code explicitly; only exists for proxy support. -
ProviderBase
protected ProviderBase(MAPPER_CONFIG mconfig, com.fasterxml.jackson.databind.util.LookupCache<AnnotationBundleKey, EP_CONFIG> readerCache, com.fasterxml.jackson.databind.util.LookupCache<AnnotationBundleKey, EP_CONFIG> writerCache) - Since:
- 2.17
-
-
Method Details
-
checkCanDeserialize
public void checkCanDeserialize(boolean state) Method for defining whether actual detection for existence of a deserializer for type should be done whenisReadable(java.lang.Class<?>, java.lang.reflect.Type, java.lang.annotation.Annotation[], jakarta.ws.rs.core.MediaType)
is called. -
checkCanSerialize
public void checkCanSerialize(boolean state) Method for defining whether actual detection for existence of a serializer for type should be done whenisWriteable(java.lang.Class<?>, java.lang.reflect.Type, java.lang.annotation.Annotation[], jakarta.ws.rs.core.MediaType)
is called. -
addUntouchable
Method for marking specified type as "untouchable", meaning that provider will not try to read or write values of this type (or its subtypes).- Parameters:
type
- Type to consider untouchable; can be any kind of class, including abstract class or interface. No instance of this type (including subtypes, i.e. types assignable to this type) will be read or written by provider
-
removeUntouchable
Method for removing definition of specified type as untouchable: usually only- Since:
- 2.2
-
setAnnotationsToUse
Method for configuring which annotation sets to use (including none). Annotation sets are defined in order decreasing precedence; that is, first one has the priority over following ones.- Parameters:
annotationsToUse
- Ordered list of annotation sets to use; if null, default
-
setMapper
Method that can be used to directly defineObjectMapper
to use for serialization and deserialization; if null, will use the standard provider discovery from context instead. Default setting is null. -
setDefaultReadView
Method for specifying JSON View to use for reading content when end point does not have explicit View annotations.- Since:
- 2.3
-
setDefaultWriteView
Method for specifying JSON View to use for reading content when end point does not have explicit View annotations.- Since:
- 2.3
-
setDefaultView
Method for specifying JSON View to use for reading and writing content when end point does not have explicit View annotations. Functionally equivalent to:setDefaultReadView(view); setDefaultWriteView(view);
- Since:
- 2.3
-
configure
-
enable
-
enable
-
disable
-
disable
-
isEnabled
-
configure
-
enable
-
disable
-
configure
-
enable
-
disable
-
enable
-
enable
-
disable
-
disable
-
configure
-
configure
-
hasMatchingMediaTypeForReading
Helper method used to check whether given media type is supported by this provider for read operations (when binding input data such as POST body).Default implementation simply calls
hasMatchingMediaType(jakarta.ws.rs.core.MediaType)
.- Since:
- 2.3
-
hasMatchingMediaTypeForWriting
Helper method used to check whether given media type is supported by this provider for writing operations, such as when converting response object to response body of request (like GET or POST).Default implementation simply calls
hasMatchingMediaType(jakarta.ws.rs.core.MediaType)
.- Since:
- 2.3
-
hasMatchingMediaType
Helper method used to check whether given media type is supported by this provider.- Since:
- 2.2
-
_locateMapperViaProvider
Helper method that is called if no mapper has been explicitly configured. -
_configForReading
protected EP_CONFIG _configForReading(MAPPER mapper, Annotation[] annotations, Class<?> defaultView) -
_configForWriting
protected EP_CONFIG _configForWriting(MAPPER mapper, Annotation[] annotations, Class<?> defaultView) -
_configForReading
protected abstract EP_CONFIG _configForReading(com.fasterxml.jackson.databind.ObjectReader reader, Annotation[] annotations) -
_configForWriting
protected abstract EP_CONFIG _configForWriting(com.fasterxml.jackson.databind.ObjectWriter writer, Annotation[] annotations) -
getSize
public long getSize(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) Method that JAX-RS container calls to try to figure out serialized length of given value. Since computation of this length is about as expensive as serialization itself, implementation will return -1 to denote "not known", so that container will determine length from actual serialized output (if needed).- Specified by:
getSize
in interfaceMessageBodyWriter<THIS extends ProviderBase<THIS,
MAPPER, EP_CONFIG, MAPPER_CONFIG>>
-
isWriteable
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) Method that JAX-RS container calls to try to check whether given value (of specified type) can be serialized by this provider. Implementation will first check that expected media type is expected one (by call tohasMatchingMediaType(jakarta.ws.rs.core.MediaType)
); then verify that type is not one of "untouchable" types (types we will never automatically handle), and finally that there is a serializer for type (iffcheckCanSerialize(boolean)
has been called with true argument -- otherwise assumption is there will be a handler)- Specified by:
isWriteable
in interfaceMessageBodyWriter<THIS extends ProviderBase<THIS,
MAPPER, EP_CONFIG, MAPPER_CONFIG>>
-
writeTo
public void writeTo(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOExceptionMethod that JAX-RS container calls to serialize given value.- Specified by:
writeTo
in interfaceMessageBodyWriter<THIS extends ProviderBase<THIS,
MAPPER, EP_CONFIG, MAPPER_CONFIG>> - Throws:
IOException
-
findEncoding
protected com.fasterxml.jackson.core.JsonEncoding findEncoding(MediaType mediaType, MultivaluedMap<String, Object> httpHeaders) Helper method to use for determining desired output encoding. For now, will always just use UTF-8... -
_modifyHeaders
protected void _modifyHeaders(Object value, Class<?> type, Type genericType, Annotation[] annotations, MultivaluedMap<String, Object> httpHeaders, EP_CONFIG endpoint) throws IOExceptionOverridable method used for adding optional response headers before serializing response object.- Throws:
IOException
-
_createGenerator
protected com.fasterxml.jackson.core.JsonGenerator _createGenerator(com.fasterxml.jackson.databind.ObjectWriter writer, OutputStream rawStream, com.fasterxml.jackson.core.JsonEncoding enc) throws IOException Overridable helper method called to create aJsonGenerator
for writing contents into given rawOutputStream
.- Throws:
IOException
- Since:
- 2.3
-
_endpointForWriting
protected EP_CONFIG _endpointForWriting(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders) -
isReadable
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) Method that JAX-RS container calls to try to check whether values of given type (and media type) can be deserialized by this provider. Implementation will first check that expected media type is a JSON type (via call tohasMatchingMediaType(jakarta.ws.rs.core.MediaType)
); then verify that type is not one of "untouchable" types (types we will never automatically handle), and finally that there is a deserializer for type (iffcheckCanDeserialize(boolean)
has been called with true argument -- otherwise assumption is there will be a handler)- Specified by:
isReadable
in interfaceMessageBodyReader<THIS extends ProviderBase<THIS,
MAPPER, EP_CONFIG, MAPPER_CONFIG>>
-
readFrom
public Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOExceptionMethod that JAX-RS container calls to deserialize given value.- Specified by:
readFrom
in interfaceMessageBodyReader<THIS extends ProviderBase<THIS,
MAPPER, EP_CONFIG, MAPPER_CONFIG>> - Throws:
IOException
-
_createParser
protected com.fasterxml.jackson.core.JsonParser _createParser(com.fasterxml.jackson.databind.ObjectReader reader, InputStream rawStream) throws IOException Overridable helper method called to create aJsonParser
for reading contents of given rawInputStream
. May return null to indicate that Stream is empty; that is, contains no content.- Throws:
IOException
- Since:
- 2.2
-
_endpointForReading
protected EP_CONFIG _endpointForReading(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders) Overridable helper method that will basically fetch representation of the endpoint that can be used to getObjectReader
to use for deserializing content- Since:
- 2.8
-
locateMapper
Method called to locateObjectMapper
to use for serialization and deserialization. Exact logic depends on setting ofJaxRSFeature.DYNAMIC_OBJECT_MAPPER_LOOKUP
.If
JaxRSFeature.DYNAMIC_OBJECT_MAPPER_LOOKUP
is disabled (default setting unless changed), behavior is as follows:- If an instance has been explicitly defined by
setMapper(MAPPER)
(or non-null instance passed in constructor), that will be used. - If not, will try to locate it using standard JAX-RS
ContextResolver
mechanism, if it has been properly configured to access it (by JAX-RS runtime). - Finally, if no mapper is found, will return a default unconfigured
ObjectMapper
instance (one constructed with default constructor and not modified in any way)
If
JaxRSFeature.DYNAMIC_OBJECT_MAPPER_LOOKUP
is enabled, steps 1 and 2 are reversed, such that JAX-RSContextResolver
is first used, and only if none is defined will configured mapper be used.- Parameters:
type
- Class of object being serialized or deserialized; not checked at this point, since it is assumed that unprocessable classes have been already weeded out, but will be passed toContextResolver
as is.mediaType
- Declared media type for the instance to process: not used by this method, but will be passed toContextResolver
as is.
- If an instance has been explicitly defined by
-
_isSpecialReadable
Overridable helper method used to allow handling of somewhat special types for reading- Since:
- 2.2
-
_isIgnorableForReading
Overridable helper method called to check whether given type is a known "ignorable type" (in context of reading), values of which are not bound from content.- Since:
- 2.6
-
_isIgnorableForWriting
Overridable helper method called to check whether given type is a known "ignorable type" (in context of reading), values of which can not be written out.- Since:
- 2.6
-
_createNoContentException
-
_containedIn
-
_findCustomUntouchable
-
findSuperTypes
-
findSuperTypes
-
_addSuperTypes
protected static void _addSuperTypes(Class<?> cls, Class<?> endBefore, Collection<Class<?>> result, boolean addClassItself)
-