Hi! Of course my code is related to XML:
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? 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 > <javascript:>> 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 <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.