On Thu, Mar 23, 2017 at 11:34 AM, Zsolt Balanyi <zsolt.bala...@gmail.com> 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+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. -- 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.