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? Also where can I find some resources on the architecture of the Jackson project?
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 > <javascript:>> 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 <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.