I finally switched to JAXB and with the help of ValidationEventCollector I was able to pinpoint all the problems with my schema / xml. I tried briefly to use the modified schema with the castor but I ended up with the same marshalling exception. I didn't investigate further because the JAXB objects work for me quite well and I'm on a very tight deadline. Thanks all for your help.
Lukasz -----Original Message----- From: Werner Guttmann [mailto:[email protected]] Sent: May-07-09 2:40 AM To: [email protected] Subject: Re: [castor-user] [xml] The class for the root element ... could not be found Lukasz, I have just added some comments to one of the Jira issues raised by you. Are they of any use to you ? Cheers Werner Lukasz Kustusz wrote: > I gave it a shot, but, just like before I'm getting a NullPointerException on > the classDescriptorResolver.setClassLoader. > Here's my code again: > > Unmarshaller unmarshaller; > XMLClassDescriptorResolver classDescriptorResolver; > PromoCallType promocall ; > String[] s = new > String[]{"nikonpromosystem","nikonpromosystem.descriptors","nikonpromosystem.types","nikonpromosystem.types.descriptiors"} > > classDescriptorResolver = > (XMLClassDescriptorResolver)ClassDescriptorResolverFactory.createClassDescriptorResolver(BindingType.XML); > classDescriptorResolver.setClassLoader(this.getClass().getClassLoader()); > //NullPointerException > classDescriptorResolver.addPackages(s); > unmarshaller = new Unmarshaller(); > unmarshaller.setResolver(classDescriptorResolver); > reader = new FileReader("promo_in_3_6.xml"); > promocall = (nikonpromosystem.PromoCallType) unmarshaller.unmarshal(reader); > > > When I change to the XMLContext, I get a MarshalException : "The marshaller > cannot marshal/unmarshal types of Void.class, Class.class or Object.class"" > My code with the XMLContext: > > context = new XMLContext(); > context.addPackages(s); > unmarshaller = context.createUnmarshaller(); > unmarshaller.setClassLoader(getClass().getClassLoader()); > reader = new FileReader("promo_in_3_6.xml"); > promocall = (nikonpromosystem.PromoCallType) unmarshaller.unmarshal(reader); > //MarshalException happens here > > > Lukasz > > > > > > -----Original Message----- > From: Werner Guttmann [mailto:[email protected]] > Sent: May-04-09 6:32 AM > To: [email protected] > Subject: Re: [castor-user] [xml] The class for the root element ... could not > be found > > Hi, > > to cut things short, can I ask you somthing ? Can you please - for the > time being - switch to using the generated descriptor classes, as I am > 100% sure that things should work out of the box. > > In other words, drop generation of the mapping file, re-enable > generation of the descriptor classes, and you should be flying. As you > compile and package your applications, don't forget to include the > .castor.cdr files as generated during code generation. > > Can you please try that ? > > lG. > Werner > > Lukasz Kustusz wrote: >> Again I got a little bit ahead. The missing methods I just added manually >> like so: >> >> public nikonpromosystem.ExtraParameters[] getExtraParametersList() { >> //this class is virtually the same as getExtraParameters(), that was >> auto-generated. I just changed the name >> nikonpromosystem.ExtraParameters[] array = new >> nikonpromosystem.ExtraParameters[0]; >> return (nikonpromosystem.ExtraParameters[]) >> this._extraParametersList.toArray(array); >> } >> >> public boolean isExtraParametersList(final >> nikonpromosystem.ExtraParameters[] lst) { >> //unfortunately there was no isExtraParameters(). I had to do >> that from the scratch. >> boolean retval = this._extraParametersList.equals(lst); >> return retval; >> } >> >> If there's a better way, please let me know. I had to do that for every >> class that had Lists. >> >> After that the addmapping works, but unmarshal returns all nulls. So again >> the code: >> >> Mapping mapping = new Mapping(getClass().getClassLoader()); >> URL url1 = >> getClass().getClassLoader().getResource("binding/promomap.xml"); >> mapping.loadMapping(url1); >> XMLContext context = new XMLContext(); >> context.addMapping(mapping);//I go past this point now >> >> FileReader reader = new FileReader(sFileName); >> nikonpromosystem.PromoCall promocall = (nikonpromosystem.PromoCall) >> unmarshaller.unmarshal(reader); >> >> //The unmarshal works but all fields inside promocall are null. When I >> step into this statement, It only executes the constructor, which calls the >> PromoCallType constructor which creates new lists and returns. >> >> I also tried to unmarshal into the type object >> nikonpromosystem.PromoCallType promocall = >> (nikonpromosystem.PromoCallType) unmarshaller.unmarshal(reader); >> >> but the result is the same - all fields are null. >> >> >> Here's the mapping of the PromoCall: >> <class name="nikonpromosystem.PromoCall" access="shared"> >> <map-to xml="PromoCall" element-definition="true"/> >> </class> >> >> Now I noticed that all type classes in the mapping are trying to map to the >> xml names like so, but in the xml there's no PromoCallType tag, because it's >> a type that's only defined in the scheme. >> <class name="nikonpromosystem.PromoCallType" access="shared"> >> <map-to xml="PromoCallType" element-definition="false"/> >> <field name="promoCallID" type="nikonpromosystem.PromoCallID" >> required="true"> >> <bind-xml name="PromoCallID" node="element"/> >> </field> >> <field name="account" type="nikonpromosystem.Account"> >> <bind-xml name="Account" node="element"/> >> </field> >> : >> : >> </class> >> >> How can I make it work? >> >> >> >> >> Hi, >> >> replying sequentially .. ;-). >> >> Lukasz Kustusz wrote: >>> OK, I got a little bit further along now. The fix to the >>> MappingException was the incorrect classLoader. I found a fix here: >>> >>> http://www.mail-archive.com/[email protected]/msg00196.html >>> >>> After that I've had some issues with type-safe enums. The error was >>> like below: "org.exolab.castor.mapping.MappingException: The Java >>> class nikonpromosystem.PromoStatus is not constructable -- it does >>> not contain a default public constructor." The fix for that was in >>> http://castor.codehaus.org/xml-mapping.html in sections 7.5 and 7.4. >>> The PromoStatus was a special case. It was an enum but in an >>> attribute, so the verify-constructable="false" didn't work on it. I >>> had to change it to an element. >> Hmm, that should not be required. Can you please raise a Jira issue and >> attach a very simple sample for us to reply this ? >> >> Sure, http://jira.codehaus.org/browse/CASTOR-2701 >> >>> Now I've finally arrived at the following error: >>> >>> "The method getExtraParametersList/isExtraParametersList in class >>> nikonpromosystem.PromotionType accepting/returning object of type >>> class nikonpromosystem.ExtraParameters was not found" >> That indicates that in your mapping you have a field mapping for a >> property 'extraParametersList' with a type of 'ExtraParameters'. Is that >> meant to be a collection or not ? How does the mapping for this one >> property look like ? >> Here's the relevant mapping section: >> <class name="nikonpromosystem.PromoParameterType" access="shared"> >> <map-to xml="PromoParameterType" element-definition="false"/> >> . >> . >> . >> <field name="extraParametersList" type="nikonpromosystem.ExtraParameters"> >> <bind-xml name="ExtraParameters" node="element"/> >> </field> >> . >> </class> >> >> Here's the relevant schema section: >> <xs:complexType name="PromotionType"> >> <xs:sequence minOccurs="1" maxOccurs="1"> >> <xs:element name="promoSource"> >> <xs:simpleType> >> <xs:restriction base="xs:string"> >> <xs:enumeration value="ORDERENTRY" /> >> <xs:enumeration value="PROMOSYSTEM" /> >> </xs:restriction> >> </xs:simpleType> >> </xs:element> >> <xs:element name="promotionID" type="xs:string" /> >> <xs:element name="promotionName" type="xs:string" /> >> <xs:element minOccurs="0" maxOccurs="unbounded" name="ExtraParameters" >> type="PromoParameterType" /> >> </xs:sequence> >> </xs:complexType> >> <xs:complexType name="PromoParameterType"> >> <xs:sequence> >> <xs:element name="parameterName" type="xs:string" /> >> <xs:element name="parameterType"> >> <xs:simpleType> >> <xs:restriction base="xs:string"> >> <xs:enumeration value="IMAGEPATH" /> >> <xs:enumeration value="INVOICEMESSAGE" /> >> <xs:enumeration value="AGENTMESSAGE" /> >> <xs:enumeration value="INPUTPARAMETER" /> >> </xs:restriction> >> </xs:simpleType> >> </xs:element> >> <xs:element name="parameterValue" type="xs:string" /> >> </xs:sequence> >> </xs:complexType> >> >> >> This is the xml: >> >> <ns0:ForcedPromotions> >> <ns0:promoSource>ORDERENTRY</ns0:promoSource> >> <ns0:promotionID>130</ns0:promotionID> >> <ns0:promotionName>NIKON COUPONS 1</ns0:promotionName> >> <ns0:ExtraParameters> >> <ns0:parameterName>COUPON NUMBER1</ns0:parameterName> >> <ns0:parameterType>INPUTPARAMETER</ns0:parameterType> >> <ns0:parameterValue>12345AB</ns0:parameterValue> >> </ns0:ExtraParameters> >> <ns0:ExtraParameters> >> <ns0:parameterName>COUPON NUMBER2</ns0:parameterName> >> <ns0:parameterType>INPUTPARAMETER</ns0:parameterType> >> <ns0:parameterValue>1243C</ns0:parameterValue> >> </ns0:ExtraParameters> >> </ns0:ForcedPromotions> >> >> >> >>> Do I have to try to create these methods by hand, or did I miss >>> something? I'm attaching the latest versions of my schema, sample >>> XML, and the mapping. >> Not really of use here. Please always try to be as specific as possible >> when asking questions. >>> Lukasz >>> >>> -----Original Message----- From: Lukasz Kustusz Sent: April-29-09 >>> 1:12 PM To: [email protected] Subject: RE: [castor-user] [xml] >>> The class for the root element ... could not be found >>> >>> Thank you for answering. I'm not sure I understand the question >>> properly. I think the descriptors did get generated. It wasn't a >>> requirement, just the way I run the generator. I added the -nodesc >>> flag and now I have the mapping (attached) and the descriptors are >>> gone. >>> >>> But when I try to use it I get the MappingException "Could not find >>> the class nikonpromosystem.PromoCall", even though the package is >>> listed in the source packages in my project, and the PromoCall class >>> is in there. Note that the declaration of PromoCall works, so the >>> class is visible. >>> >>> Here's my code: >>> >>> nikonpromosystem.PromoCall promocall; Mapping mapping = new >>> Mapping(); URL url1 = >>> this.getClass().getClassLoader().getResource("binding/promomap.xml"); >>> mapping.loadMapping(url1); Unmarshaller unmarshaller = new >>> Unmarshaller(promocall.getClass()); unmarshaller.setMapping(mapping); >>> //error occurs here >>> >>> I also tried defining promocall as nikonpromosystem.PromoCallType, >>> but I got the same error. >>> >>> Lukasz >>> >>> -----Original Message----- From: Werner Guttmann >>> [mailto:[email protected]] Sent: April-29-09 6:05 AM To: >>> [email protected] Subject: Re: [castor-user] [xml] The class >>> for the root element ... could not be found >>> >>> Hi Lukasz, >>> >>> before trying to answer your questions (inline, that is), can I ask >>> you something ? What's the reason to generate Java classes from your >>> XML schema without descriptor classes (instead of a mapping file) ? I >>> just would like to understand this requirement. >>> >>> Cheers Werner >>> >>> Lukasz Kustusz wrote: >>>> Hello, >>>> >>>> Actually I have several newbie questions, as I'm not sure I know >>>> what I'm doing with Castor, but the final message in the log >>>> (attached) is where I finally hit the wall. >>>> >>>> I'm trying to: 1. Generate necessary objects from a xsd schema >>>> (attached). To this effect I'm using the below command >>>> >>>> >>>> java -classpath >>>> .;C:\Progra~1\Java\jdk1.6.0_11\jre\lib\ext\castor-1.2\castor-1.2-codeg >>>> >>>> en.jar;C:\Progra~1\Java\jdk1.6.0_11\jre\lib\ext\castor-1.2\castor-1.2. >>>> >>>> jar;C:\Progra~1\Java\jdk1.6.0_11\jre\lib\ext\castor-1.2\castor-1.2-xml >>>> >>>> .jar;C:\Progra~1\Java\jdk1.6.0_11\jre\lib\ext\commons-logging-1.1.1.ja >>>> >>>> r;C:\Progra~1\Java\jdk1.6.0_11\jre\lib\ext\castor-1.2\castor-1.2-xml-s >>>> >>>> chema.jar;C:\Progra~1\Java\jdk1.6.0_11\jre\lib\ext\castor-1.2\castor-1 >>>> >>>> .2-ddlgen.jar;C:\Progra~1\Java\jdk1.6.0_11\jre\lib\ext\velocity-1.6.2. >>>> jar org.exolab.castor.builder.SourceGeneratorMain -i >>>> Resources\promo3_4.xsd -package nikonpromosystem -gen-mapping >>>> promomap -verbose >>>> >>>> Here there's two issues: First the mapping (sic!) doesn't get >>>> generated, even though the command executes without errors. >>> In addition to the -gen-mapping option you will have to use the >>> -nodesc option. >>> >>>> Second of all I get my objects in 4 different packages: >>>> >>>> nikonpromosystem nikonpromosystem.descriptors >>>> nikonpromosystem.types nikonpromosystem.types.descriptors >>> Yes, this is default. When you start using the -nodesc option, the >>> descriptors packages will disappear. >>> >>>> In classes.txt there's the listing of all the classes generated. >>>> Definitelly more than I expected from the xsd. Nevertheless I tried >>>> to use those classes in my code, using the code examples without >>>> the mapping (castor-reference-guide-1.3 sections 1.8.2.2 & >>>> 1.8.2.3.2) . Here's the code: >>> Hi, if you did not use this with the mapping file(that did not get >>> generated), there is no use trying this, as the XML >>> generated/unmarshalled from will not meet the XML schema. You will >>> have to use either the mapping generated and or the XML class >>> descriptors. >>>> private Unmarshaller unmarshaller; private Marshaller marshaller; >>>> private XMLContext context; private static Logger log; private >>>> XMLClassDescriptorResolver classDescriptorResolver; private >>>> nikonpromosystem.PromoCall promocall ; >>>> >>>> promocall = new nikonpromosystem.PromoCall(); String[] s = new >>>> String[]{"nikonpromosystem","nikonpromosystem.descriptors","nikonpromo >>>> system.types","nikonpromosystem.types.descriptiors"}; context = >>>> new XMLContext(); try { context.addPackages(s); //that's where the >>>> error happens; } catch (ResolverException ex) { log.error(ex);} >>>> >>>> unmarshaller = context.createUnmarshaller(); marshaller = >>>> context.createMarshaller(); >>>> >>>> reader = new FileReader("sample.xml"); promocall = >>>> (nikonpromosystem.PromoCall) unmarshaller.unmarshal(reader); >>>> >>>> >>>> I also tried to replace the XMLContext with classDescriptorResolver >>>> bat that also failed: >>>> >>>> promocall = new nikonpromosystem.PromoCall(); >>>> classDescriptorResolver = >>>> (org.exolab.castor.xml.XMLClassDescriptorResolver)ClassDescriptorResol >>>> verFactory.createClassDescriptorResolver(BindingType.XML); >>>> >>>> classDescriptorResolver.setClassLoader(promocall.getClass().getClassLo >>>> ader()); //NullPointerException >>>> >>>> I also tried generating the mapping from within the code using the >>>> MappingTool, but...: >>>> >>>> MappingTool tool = new MappingTool(); promocall = new >>>> nikonpromosystem.PromoCall(); tool.addClass(promocall.getClass()); >>>> //NullPointerException >>>> >>>> At this point I don't know what else I can try... Help? >>>> >>>> >>>> Lukasz. >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> ---------------------------------------------------------------------- >>>> -- >>>> >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe from this list, please visit: >>>> >>>> http://xircles.codehaus.org/manage_email >>> --------------------------------------------------------------------- >>> To unsubscribe from this list, please visit: >>> >>> http://xircles.codehaus.org/manage_email >>> >>> >>> >>> >>> ------------------------------------------------------------------------ >>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe from this list, please visit: >>> >>> http://xircles.codehaus.org/manage_email >> --------------------------------------------------------------------- >> To unsubscribe from this list, please visit: >> >> http://xircles.codehaus.org/manage_email >> >> >> >> --------------------------------------------------------------------- >> To unsubscribe from this list, please visit: >> >> http://xircles.codehaus.org/manage_email >> >> >> >> --------------------------------------------------------------------- >> To unsubscribe from this list, please visit: >> >> http://xircles.codehaus.org/manage_email >> >> > > --------------------------------------------------------------------- > To unsubscribe from this list, please visit: > > http://xircles.codehaus.org/manage_email > > > > --------------------------------------------------------------------- > To unsubscribe from this list, please visit: > > http://xircles.codehaus.org/manage_email > > --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email

