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.
