Added issue here: https://github.com/FasterXML/jackson-databind/issues/1376
Thanks! On Saturday, September 10, 2016 at 10:17:45 PM UTC-4, Tatu Saloranta wrote: > > On Sat, Sep 10, 2016 at 5:10 PM, Brent Ryan <brent...@gmail.com > <javascript:>> wrote: > >> So using a mixin did NOT work. Here's the mixin: >> >> interface DisableAdditionalPropertiesMixIn { >> >> @JsonIgnore >> Map<String, Object> getAdditionalProperties(); >> >> @JsonIgnore >> void setAdditionalProperty(String name, Object value); >> } >> >> m.addMixInAnnotations(Data.class, DisableAdditionalPropertiesMixIn.class); >> >> This basically did nothing. My guess is that mixins only allow you to >> add OR override any existing annotation, but not remove it/ignore it unless >> the annotation itself supports some flag you can set to disable it. >> > > Mix-in annotations are very simple: they only allow you to add a "missing" > annotation, or replace existing one. But there is no per-annotation logic > to replace other annotations: for example, just because you add > `@JsonIgnore` does not remove `@JsonAnySetter` or `@JsonAnyGetter`. > > However... aside from mix-ins, perhaps behavior of having both > `@JsonIgnore` and any-setter/any-getter annotation ought to mean that the > accessor is ignored, and not considered any-setter/any-getter? > This logic would reside at code that determines actual bean definition, > outside of mix-in handler, and I don't think ignorals are currently > considered. > > One other related comment on disabling annotations: it is actually > possible to also "undo" ignoral by using mix-in for > > @JsonIgnore(false) > > since @JsonIgnore does take boolean value (with default of `true`): it > determines if ignorals is enabled or not. And the only reason for that is > to allow overriding an existing ignoral either by sub-class (annotations > are inherited, so sub-classes can override annotations), or by mix-ins. > > Come to think of this now, another possibly better improvement, to allow > disabling, would be to make @JsonAnyGetter and @JsonAnySetter to also use > boolean `value`, similar to @JsonIgnore. > > If so, you could add, via mix-in: > > @JsonAnySetter(false) > > to effectively disable usage. > > >> So instead, I did this: >> >> >> public class IgnoreAdditionalPropertiesInspector extends >> JacksonAnnotationIntrospector { >> >> @Override >> public boolean hasAnySetterAnnotation(AnnotatedMethod am) { >> return false; >> } >> >> @Override >> public boolean hasAnyGetterAnnotation(AnnotatedMethod am) { >> return false; >> } >> >> } >> >> JacksonAnnotationIntrospector introspector = new >> IgnoreAdditionalPropertiesInspector(); >> m.setAnnotationIntrospector(introspector); >> >> >> This works! woohoo! >> > > Yes, that makes sense to me. > > >> >> However, I'm curious if there's any better way to achieve this or is this >> the recommended approach? >> > > I think your approach is very sensible and something I could have > recommended myself. > > But I think this does also raise the question of whether override system > for any-properties could and should be improved. > > Could you file an issue (RFE) for this at: > > https://github.com/FasterXML/jackson-databind/issues > > so that we could perhaps get it added in 2.9? I know it is not something > you need, with AnnotationIntrospector, but seems a worthwhile and quite > straight-forward addition. > > -+ Tatu +- > > >> >> Thanks! >> >> >> On Friday, September 9, 2016 at 6:50:48 PM UTC-4, Brent Ryan wrote: >>> >>> I'm going to attempt to do this by just creating a >>> DisableAdditionalPropertiesMixin class that I can apply. I'm not sure this >>> will work and it kinda sucks because it means that the only way for it to >>> work for everything is to apply this to every Object in the hierarchy. >>> >>> Any other ideas here? >>> >>> >>> On Friday, September 9, 2016 at 6:07:47 PM UTC-4, Brent Ryan wrote: >>>> >>>> We're looking to see if there's a way to use the same model with >>>> @JsonAnySetter jackson pattern for serialization to backend data storage, >>>> while allowing us to use the same models for the inbound API requests that >>>> are more strict. So we want FAIL_ON_UNKNOWN_PROPERTIES set to true and >>>> @JsonAnySetter to be disabled from the API perspective. >>>> >>>> Is there a way to do this or do you have to have 2 separate models or >>>> use mix-ins? Looking for the preferred approach to dealing with this. >>>> >>>> Example class: >>>> >>>> public class Data { >>>> >>>> @JsonIgnore >>>> private Map<String, Object> additionalProperties = new >>>> HashMap<String, Object>(); >>>> >>>> @JsonAnyGetter >>>> public Map<String, Object> getAdditionalProperties() { >>>> return this.additionalProperties; >>>> } >>>> >>>> @JsonAnySetter >>>> public void setAdditionalProperty(String name, Object value) { >>>> this.additionalProperties.put(name, value); >>>> } >>>> >>>> } >>>> >>>> Is there a way to disable a feature in ObjectMapper that turns off the >>>> JsonAnySetter/JsonAnyGetter for 1 use case, but then enables it for others? >>>> >>> -- >> 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 jackson-user...@googlegroups.com <javascript:>. >> To post to this group, send email to jackso...@googlegroups.com >> <javascript:>. >> 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 jackson-user+unsubscr...@googlegroups.com. To post to this group, send email to jackson-user@googlegroups.com. For more options, visit https://groups.google.com/d/optout.