On Thu, Dec 28, 2017 at 2:16 AM, Bojan Tomic <[email protected]> wrote:
> Yes, TYPE_USE annotations and AnnotatedType were added in Java 8.
> As you noted, processing these can get quite hairy, but at least some
> support in Jackson would be very welcome.
> I am intimately familiar with the complexities involved, as I am the
> developer behind GeAnTyRef, a fork of GeTyRef (a library similar to
> ClassMate), that deeply supports working with AnnotatedTypes.

Ah. Yes, your help here is appreciated and we could use your expertise.
Especially since you have an actual use case -- it's much easier to
add support for existing
use case, as opposed to expected or potential one.

> I'm of the opinion Jackson would greatly gain in versatility if this style
> of annotations was supported (as it makes it possible to convey
> (de)serialization hints on a very granular level).
> As I've mentioned, I'd be happy to contribute in order to get this feature
> faster, if you'd be interested.

Yes, I think that would make sense.

As I said, `master` branch would be the the way to go at this point.
Code has been refactored quite a bit
since 2.9 in some places, but not so much wrt functionality for this,
I think. But code for 3.0 requires Java 8,
and 2 out of 3 modules (parameter names, Optional and other new types)
are part of `jackson-databind` now.

-+ Tatu +-


>
>
>
> On Thursday, December 28, 2017 at 6:42:28 AM UTC+1, Tatu Saloranta wrote:
>>
>> On Wed, Dec 27, 2017 at 9:33 AM, Bojan Tomic <[email protected]> wrote:
>> > Just for the sake of experimentation, I've cobbled together the
>> > following
>> > wrapper class:
>> >
>> > class AnnotatedJavaType extends JavaType implements AnnotatedElement {
>> >
>> >   private final JavaType base;
>> >   private final Annotation[] annotations;
>> >
>> >   AnnotatedJavaType(JavaType base, Annotation[] annotations) { ... }
>> >
>> >   //all methods simply delegate to this.base
>> > }
>> >
>> >
>> >
>> > And the corresponding TypeFactory wrapper:
>> >
>> > class AnnotatedTypeFactory {
>> >
>> >   JavaType construct(AnnotatedType type, TypeFactory typeFactory) {
>> >     if (type instanceof AnnotatedParameterizedType) {
>> >       JavaType[] args = Arrays.stream(((AnnotatedParameterizedType)
>> > type).getAnnotatedActualTypeArguments())
>> >         .map(arg -> fromJavaType(arg, typeFactory))
>> >         .toArray(JavaType[]::new);
>> >
>> >       TypeBindings bindings =
>> > TypeBindings.create(ClassUtils.getRawType(type.getType()), args);
>> >
>> >       return new
>> > AnnotatedJavaType(typeFactory.constructType(type.getType(),
>> > bindings), type.getAnnotations());
>> >     }
>> >
>> >     //handle wildcards, arrays, variables in the similar fashion
>> >
>> >     return new
>> > AnnotatedJavaType(typeFactory.constructType(type.getType()),
>> > type.getAnnotations());
>> >   }
>> > }
>> >
>> > Amusingly enough, it works! I'd never keep it in my code base, but it
>> > was an
>> > interesting experiment.
>> >
>> > If the functionality I'm after is impossible (and I really hope it is
>> > not),
>> > would you be open to a contribution? I'd of course need some
>> > consultation/guidance on the approach, but would be happy to develop it.
>>
>> As per my other note, this would need to be in Jackson 3.0 I think,
>> due to multiple reasons.
>>
>> I am bit hesitant to say much more since I really fear all complexity
>> that would come from trying
>> to create parallel annotation processing system. I can see some
>> benefits from type annotations,
>> but it wouldn't come for free, if we are talking about whole
>> AnnotationIntrospector style system.
>>
>> However: if the idea would be to do something simpler -- I don't
>> really see need for full AnnotationIntrospector
>> in this case, to be honest -- for example, simply keep track of
>> annotations for type, offer access... well,
>> that seems quite doable and useful. If so, `JavaType` could just have
>> `findAnnotation(Class<?> type)` method
>> or something?
>>
>> -+ Tatu +-
>>
>>
>>
>> >
>> >
>> >
>> >
>> > On Wednesday, December 27, 2017 at 11:34:37 AM UTC+1, Bojan Tomic wrote:
>> >>
>> >> I have a rather exotic use-case that I have to support. Types annotated
>> >> with @Id need custom deserialization logic, e.g. the value should be
>> >> Base64
>> >> decoded before deserializing it (not the only case).
>> >>
>> >> This means a type such as List<@Id Key> will be represented as a list
>> >> of
>> >> Base64 Strings that I deserialize using my custom logic.
>> >>
>> >> I originally have an AnnotatedType that I convert to JavaType using
>> >> TypeFactory.constructType(annotatedType.getType()) prior to
>> >> deserialization,
>> >> which of course looses all the annotations.
>> >> Later, in my custom Deserializers instance, in its various
>> >> findXXXDeserializer methods, I have no way to find the correct
>> >> deserializer
>> >> as the annotations needed for the decision are gone...
>> >>
>> >> I was hoping the JDK8 module would have it's own TypeFactory-like
>> >> mechanism to construct JavaType subclasses that preserve the
>> >> annotations
>> >> from AnnotatedTypes (e.g.
>> >> AnnotatedTypeFactory.constructType(annotatedType)), but it doesn't seem
>> >> to
>> >> be the case.
>> >>
>> >> Is there any way at all to implement what I'm after?
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "jackson-user" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > email to [email protected].
>> > To post to this group, send email to [email protected].
>> > For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google Groups
> "jackson-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to