users@jaxb.java.net

Re: Error marshalling JAXB object

From: Wolfgang Laun <wolfgang.laun_at_gmail.com>
Date: Fri, 7 Aug 2009 21:53:22 +0200

On Fri, Aug 7, 2009 at 9:23 PM, swtking <rajkal23_at_yahoo.com> wrote:

>
> Thanks for your response. Made changes to MyHashMapAdapter.java the format
> I
> needed but still no luck.
>
> I am trying to get output in this format.
>
> <xml>
> <abc>
> <123></123>
> <345></345>
> </abc>
> <def>
> <789></789>
> </def>
> </xml>
>

You won't be able to get anywhere close to this, for several reasons:
- tags can't start with a digit
- values can't be tags
- unless you override in XmlElement etc., tags will be derived from field
names

Maybe like this:

<myBean>
  <entry>
    <key>flower</key><valueList>rose lily</valueList>
  </entry>
  <entry>
    <key>fruit</key><valueList>apple orange</valueList>
  </entry>
</myBean>

-W


>
>
> MyBean.java
>
> private Map<String,List<String>> valueMapList=null;
>
> @XmlJavaTypeAdapter(MyHashMapAdapter.class)
> @XmlElement
> public Map<String, List<String>> getValueMapList() {
> return valueMapList;
> }
>
> public void setValueMapList(Map<String, List<String>> valueMapList) {
> this.valueMapList = valueMapList;
> }
>
>
> MyHashMapAdapter.java
>
> public class MyHashMapAdapter extends
> XmlAdapter<HashMap<String,List<String>>, Map<String,List<String>>> {
>
> @Override
> public HashMap<String,List<String>> unmarshal( String[] value ) {
>
> HashMap<String,List<String>> m = new HashMap<String,List<String>>();
> return m;
> }
>
>
> @Override
> public String[] marshal(List<String> arg0) throws Exception {
> String[] s = (String[]) arg0.toArray();
> return s;
> }
>
> }
>
>
>
> Wolfgang Laun-2 wrote:
> >
> > The adapter converts between String[] and List<String> but the element to
> > which the adapter is attached to is a Map<?,?>.
> >
> > You could attach an adapter to MyBean, to convert between its field
> > valueMapList and whatever. You'll have to design a class that's capable
> of
> > storing the same information as MyBean but can be handled by JAXB and is
> > structured according to the XML structure you want.
> >
> > -W
> >
> >
> > On Thu, Aug 6, 2009 at 9:16 PM, swtking <rajkal23_at_yahoo.com> wrote:
> >
> >>
> >> Could anyone tell me what I am doing wrong.
> >>
> >> Trying to marshall a complex map (Map<String,List<String>>)
> >>
> >> MyBean.java
> >>
> >> private Map<String,List<String>> valueMapList=null;
> >>
> >> @XmlJavaTypeAdapter(MyHashMapAdapter.class)
> >> @XmlElement
> >> public Map<String, List<String>> getValueMapList() {
> >> return valueMapList;
> >> }
> >>
> >> public void setValueMapList(Map<String, List<String>>
> >> valueMapList)
> >> {
> >> this.valueMapList = valueMapList;
> >> }
> >>
> >>
> >> MyHashMapAdapter.java
> >>
> >> public class MyHashMapAdapter extends XmlAdapter<String[], List<String>>
> >> {
> >>
> >> public List<String> unmarshal( String[] value ) {
> >> List<String> r = new ArrayList<String>();
> >> for( String s : value )
> >> r.add(s);
> >> return r;
> >> }
> >>
> >> public String[] unmarshal( List<String> value ) {
> >> return value.toArray(new String[value.size()]);
> >> }
> >>
> >> @Override
> >> public String[] marshal(List<String> arg0) throws Exception {
> >> String[] s = (String[]) arg0.toArray();
> >> return s;
> >> }
> >>
> >> }
> >>
> >>
> >> This is my error
> >>
> >> java.io.IOException: Error marshalling JAXB object of type "class
> >> com.MyBean".
> >> at
> >>
> >>
> com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.writeTo(AbstractRootElementProvider.java:145)
> >> at
> >>
> >>
> com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:254)
> >> at
> >>
> >>
> com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:578)
> >> at
> >>
> >>
> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:502)
> >> at
> >>
> >>
> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:493)
> >> Truncated. see log file for complete stacktrace
> >> com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 3 counts of
> >> IllegalAnnotationExceptions
> >> Adapter com.MyHashMapAdapter is not applicable to the field type
> >> java.util.Map<java.lang.String, java.util.List<java.lang.String>>.
> >> this problem is related to the following location:
> >> at
> >> @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(type=class
> >> javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter$DEFAULT,
> >> value=class
> >> com.MyHashMapAdapter)
> >> at public java.util.Map com.MyBean.getValueMapList()
> >> at com.MyBean
> >> java.util.Map is an interface, and JAXB can't handle interfaces.
> >> this problem is related to the following location:
> >> at java.util.Map
> >> at public java.util.Map com.MyBean.getValueMapList()
> >> at com.MyBean
> >> java.util.Map does not have a no-arg default constructor.
> >> this problem is related to the following location:
> >> at java.util.Map
> >> at public java.util.Map com.MyBean.getValueMapList()
> >> at com.MyBean
> >>
> >> at
> >>
> >>
> com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)
> >> at
> >>
> >>
> com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:447)
> >> at
> >>
> >>
> com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:288)
> >> at
> >>
> >>
> com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1111)
> >> at
> >>
> com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
> >> Truncated. see log file for complete stacktrace
> >>
> >>
> >> --
> >> View this message in context:
> >>
> http://www.nabble.com/Error-marshalling-JAXB-object-tp24852727p24852727.html
> >> Sent from the java.net - jaxb users mailing list archive at Nabble.com.
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscribe_at_jaxb.dev.java.net
> >> For additional commands, e-mail: users-help_at_jaxb.dev.java.net
> >>
> >>
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/Error-marshalling-JAXB-object-tp24852727p24870320.html
> Sent from the java.net - jaxb users mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jaxb.dev.java.net
> For additional commands, e-mail: users-help_at_jaxb.dev.java.net
>
>