Hi Tatu! After long investigation I found out that the order of operations in JacksonXmlModule.setupModule matters:
public void setupModule(SetupContext context) { context.addBeanSerializerModifier(new UIElementSerializerModifier()); super.setupModule(context); } produces <Page> <StackLayout> <Label text="some text"/> <Image url="mypageUrl"/> </StackLayout> </Page> what is what I want. The swapped operation order public void setupModule(SetupContext context) { super.setupModule(context); context.addBeanSerializerModifier(new UIElementSerializerModifier()); } produces the wrong output. <Page> <uiElement> <uiElements text="some text"/> <uiElements url="mypageUrl"/> </uiElement> </Page> Thanks for your help and hints! Hope I helped someone... BR, Zsolt 2017. március 24., péntek 1:06:37 UTC+1 időpontban Tatu Saloranta a következőt írta: > > On Thu, Mar 23, 2017 at 11:34 AM, Zsolt Balanyi <zsolt....@gmail.com > <javascript:>> wrote: > > Hi! > > > > Unfortunately none of the approaches worked... XmlBeanSerializerModifier > has > > a bug, and does not use the provided modifier, even if I override the > method > > you mentioned. > > Could you help me where to report the bug? > > If you can reproduce this without XML backend, it'd make sense to > report against `jackson-databind`. > If this is truly XML specific, then `jackson-dataformat-xml`. I can > help troubleshoot the problem either way, but it would be good to know > if it is XML specific or not. > > > Also where can I find some resources on the architecture of the Jackson > > project? > > I don't think there is much. I have blogged at > > http://cowtowncoder.com/blog/blog.html (older) > https://medium.com/@cowtowncoder (newer) > > and jackson-docs repo has some links > > https://github.com/FasterXML/jackson-docs/ > > but most documentation refers to public API developers are most likely to > use. > > -+ Tatu +- > > > > > BR, Zsolt > > > > 2017. március 23., csütörtök 6:45:18 UTC+1 időpontban Tatu Saloranta a > > következőt írta: > >> > >> On Wed, Mar 22, 2017 at 10:24 PM, Zsolt Balanyi <zsolt....@gmail.com> > >> wrote: > >> > Hi! > >> > > >> > Of course my code is related to XML: > >> > >> Right, I just meant it regarding general data-binding functionality. > >> Your code can certainly use its knowledge as necessary. > >> > >> > > >> > ObjectMapper om = new XmlMapper(); > >> > om.enable(SerializationFeature.INDENT_OUTPUT); > >> > om.registerModule(new JacksonXmlModule() { > >> > @Override > >> > public void setupModule(SetupContext context) { > >> > super.setupModule(context); > >> > context.addBeanSerializerModifier(new > >> > UIElementSerializerModifier()); > >> > } > >> > }); > >> > > >> > public class UIElementSerializerModifier extends > >> > XmlBeanSerializerModifier { > >> > @Override > >> > public JsonSerializer<?> modifySerializer(SerializationConfig > >> > config, > >> > BeanDescription beanDesc, JsonSerializer<?> serializer) { > >> > if > (UIElement.class.isAssignableFrom(beanDesc.getBeanClass())) { > >> > System.out.println(serializer.getClass().getName()); > >> > return new BSerializer((BeanSerializerBase) serializer); > >> > } > >> > return serializer; > >> > } > >> > } > >> > > >> > public class BSerializer extends XmlBeanSerializer { > >> > > >> > public BSerializer(BeanSerializerBase src) { > >> > super(src); > >> > } > >> > > >> > @Override > >> > public void serialize(Object bean, JsonGenerator jgen, > >> > SerializerProvider provider) throws IOException { > >> > // The breakpoint on next line is never hit!!! > >> > super.serialize(bean, jgen, provider); > >> > } > >> > } > >> > > >> > I create an object that extends UIElement, the appropriate > BSerializer > >> > is > >> > created, but never called. > >> > Is this a bug in jackson-dataformat-xml, or I'm doing wrong > something? > >> > >> One possibility is that if the type uses polymorphic handling, method > >> called is actually > >> > >> public void serializeWithType(T value, JsonGenerator g, > >> SerializerProvider p, > >> TypeSerializer ts); > >> > >> and you may need to override that as well. > >> > >> -+ Tatu +- > >> > >> > > >> > BR, Zsolt > >> > > >> > 2017. március 22., szerda 23:21:03 UTC+1 időpontban Tatu Saloranta a > >> > következőt írta: > >> >> > >> >> On Wed, Mar 22, 2017 at 1:31 AM, Zsolt Balanyi <zsolt....@gmail.com> > > >> >> wrote: > >> >> > Hi! > >> >> > > >> >> > The tag name can be easily renamed, by > >> >> > > >> >> > if (gen instanceof ToXmlGenerator) { > >> >> > ((ToXmlGenerator)gen).setNextName(new > >> >> > QName(bean.getClass().getSimpleName())); > >> >> > } > >> >> > doNormalSerialization(); > >> >> > >> >> Yes, but that does not mean much when it's `jackson-databind` and > its > >> >> type handling code which can not call such method > >> >> (it is XML specific and not needed for other formats). > >> >> > >> >> > The only problem is, that I need to serialize all other fields, > which > >> >> > I > >> >> > dont > >> >> > know how... That is why I would need to get the method to perform > the > >> >> > serialization, as the default serializer would. > >> >> > Also, the BeanSerializerModifier approach did not work. > >> >> > The new serializer is only created, but not called during the > >> >> > serialization. > >> >> > Maybe it has to something with the fact that I register it for an > >> >> > abstract > >> >> > class, and the concrete implementors still use their defaults? > >> >> > >> >> BeanSerializerModifier is a callback, but yes, result would be bound > >> >> for whatever type it was called for. > >> >> > >> >> -+ Tatu +- > >> >> > >> >> > > >> >> > BR Zsolt > >> >> > > >> >> > > >> >> > > >> >> > 2017. március 22., szerda 5:38:56 UTC+1 időpontban Tatu Saloranta > a > >> >> > következőt írta: > >> >> >> > >> >> >> On Tue, Mar 21, 2017 at 12:16 AM, Zsolt Balanyi > >> >> >> <zsolt....@gmail.com> > >> >> >> wrote: > >> >> >> > Hi! > >> >> >> > > >> >> >> > That was one of my first attempts :) > >> >> >> > > >> >> >> > <Page> > >> >> >> > <uiElement> > >> >> >> > <StackLayout> > >> >> >> > <uiElements> > >> >> >> > <Label text="some text"/> > >> >> >> > </uiElements> > >> >> >> > <uiElements> > >> >> >> > <Image url="mypageUrl"/> > >> >> >> > </uiElements> > >> >> >> > </StackLayout> > >> >> >> > </uiElement> > >> >> >> > </Page> > >> >> >> > > >> >> >> > The question is how could I ommit the uiElement nodes? > >> >> >> > >> >> >> <uiElement> itself matches property `uiElement` so that can not > be > >> >> >> removed. > >> >> >> Or, if expectation was that property name would be replaced by > type > >> >> >> id > >> >> >> that is not something Jackson supports or will be able to support > -- > >> >> >> it may make sense from XML viewpoint, but would not work with > JSON > >> >> >> or > >> >> >> any other supported dataformat. XML is bit of an outlier as its > >> >> >> structural model is the most difficult one to support, of formats > >> >> >> supported. > >> >> >> > >> >> >> -+ Tatu +- > >> >> >> > >> >> >> > > >> >> >> > BR, Zsolt > >> >> >> > > >> >> >> > 2017. március 20., hétfő 20:16:38 UTC+1 időpontban Tatu > Saloranta > >> >> >> > a > >> >> >> > következőt írta: > >> >> >> >> > >> >> >> >> Have you tried choice of `JsonTypeInfo.As.WRAPPER_OBJECT`? > >> >> >> >> That does add type id as property-name "wrapper" in JSON, and > >> >> >> >> should > >> >> >> >> work quite similarly with XML. > >> >> >> >> The main problem with XML is often, however, that the root > value > >> >> >> >> requires additional extra XML element. > >> >> >> >> > >> >> >> >> -+ Tatu +- > >> >> >> >> > >> >> >> >> On Mon, Mar 20, 2017 at 11:42 AM, Zsolt Balanyi > >> >> >> >> <zsolt....@gmail.com> > >> >> >> >> wrote: > >> >> >> >> > Hi! > >> >> >> >> > > >> >> >> >> > public class Page { > >> >> >> >> > public UIElement uiElement; > >> >> >> >> > } > >> >> >> >> > > >> >> >> >> > @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = > >> >> >> >> > JsonTypeInfo.As.PROPERTY, property = "type") > >> >> >> >> > public abstract class UIElement { > >> >> >> >> > } > >> >> >> >> > > >> >> >> >> > public class StackLayout extends UIElement { > >> >> >> >> > public List<UIElement> uiElements = new ArrayList<>(); > >> >> >> >> > } > >> >> >> >> > > >> >> >> >> > public class Label extends UIElement { > >> >> >> >> > @JacksonXmlProperty(isAttribute=true) > >> >> >> >> > public String text; > >> >> >> >> > } > >> >> >> >> > > >> >> >> >> > So basically I have a Page, that contains a StackLayout > that > >> >> >> >> > contains > >> >> >> >> > a > >> >> >> >> > Label and an Image. > >> >> >> >> > It would solve the problem, if the JsonTypeInfo could put > the > >> >> >> >> > type > >> >> >> >> > name > >> >> >> >> > to > >> >> >> >> > the element name... > >> >> >> >> > > >> >> >> >> > BR, Zsolt > >> >> >> >> > > >> >> >> >> > 2017. március 20., hétfő 19:22:10 UTC+1 időpontban Tatu > >> >> >> >> > Saloranta > >> >> >> >> > a > >> >> >> >> > következőt írta: > >> >> >> >> >> > >> >> >> >> >> What is the POJO you are serializing? > >> >> >> >> >> > >> >> >> >> >> -+ Tatu +- > >> >> >> >> >> > >> >> >> >> >> > >> >> >> >> >> On Mon, Mar 20, 2017 at 5:11 AM, Zsolt Balanyi > >> >> >> >> >> <zsolt....@gmail.com> > >> >> >> >> >> wrote: > >> >> >> >> >> > Hi! > >> >> >> >> >> > > >> >> >> >> >> > I have a structure that outputs this: > >> >> >> >> >> > > >> >> >> >> >> > <Page> > >> >> >> >> >> > <uiElement type="StackLayout"> > >> >> >> >> >> > <uiElements type="Label" text="some text"/> > >> >> >> >> >> > <uiElements type="Image" url="mypageUrl"/> > >> >> >> >> >> > </uiElement> > >> >> >> >> >> > </Page> > >> >> >> >> >> > > >> >> >> >> >> > I use @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, > >> >> >> >> >> > include=As.PROPERTY, > >> >> >> >> >> > property="type") on the common base class. > >> >> >> >> >> > How could I get the following output: > >> >> >> >> >> > > >> >> >> >> >> > <Page> > >> >> >> >> >> > <StackLayout> > >> >> >> >> >> > <Label text="some text"/> > >> >> >> >> >> > <Image url="mypageUrl"/> > >> >> >> >> >> > </StackLayout> > >> >> >> >> >> > </Page> > >> >> >> >> >> > > >> >> >> >> >> > It does not matter, if it can not be deserialized by > >> >> >> >> >> > Jackson, > >> >> >> >> >> > it > >> >> >> >> >> > is > >> >> >> >> >> > read > >> >> >> >> >> > by > >> >> >> >> >> > another system, that requires this structure. > >> >> >> >> >> > > >> >> >> >> >> > BR, Zsolt > >> >> >> >> >> > > >> >> >> >> >> > -- > >> >> >> >> >> > 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. > >> >> >> >> >> > To post to this group, send email to > >> >> >> >> >> > jackso...@googlegroups.com. > >> >> >> >> >> > 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...@googlegroups.com. > >> >> >> >> > To post to this group, send email to > >> >> >> >> > jackso...@googlegroups.com. > >> >> >> >> > 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...@googlegroups.com. > >> >> >> > To post to this group, send email to jackso...@googlegroups.com. > > >> >> >> > 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...@googlegroups.com. > >> >> > To post to this group, send email to jackso...@googlegroups.com. > >> >> > 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...@googlegroups.com. > >> > To post to this group, send email to jackso...@googlegroups.com. > >> > 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...@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.