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