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.

Reply via email to