users@jaxb.java.net

Re: Ummarshalling to Object type

From: zeiss <zeiss_at_tut.by>
Date: Mon, 3 May 2010 05:24:01 -0700 (PDT)

The corresponding schema is as follows:

<xs:complexType name="field">
  <xs:simpleContent>
    <xs:extension base="xs:anySimpleType">
        <xs:attribute type="xs:string" name="name"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

What I understood from your answer is that I have to create a child element
for <field> to hold element value. There is no other way around it if I want
JAXB to unmarshal anySimpleType to required Java type.

Now I am wondering if the impossibility to use @XmlValue here is a
limitation of the current JAXB specification or there is any technical
reason for this.

Anyway, thanks for your guidance.


Wolfgang Laun-2 wrote:
>
> Below is the generated Java code. You should be able to modify your
> code according to this.
>
> The problem is that you cannot use @XmlValue, i.e., the anySimpleType
> must be in a proper XML element of its own, i.e., a child of DocType
> (or your Field).
>
> As a rule, if you can provide an XML schema that describes what you
> want, it should be possible to hand-code Java accordingly. If you
> cannot come up with an XML schema, all bets are off ;-)
>
> -W
>
> public class DocType {
>
> @XmlElement(required = true)
> @XmlSchemaType(name = "anySimpleType")
> protected Object anyValue;
> @XmlAttribute
> protected String name;
>
> public Object getAnyValue() {
> return field;
> }
> public void setAnyValue(Object value) {
> this.anyValue = value;
> }
> public String getName() {
> return name;
> }
> public void setName(String value) {
> this.name = value;
> }
> }
>
>
>
>
> On Mon, May 3, 2010 at 11:32 AM, zeiss <zeiss_at_tut.by> wrote:
>>
>> Hi Wolfgang,
>>
>> The problem is that I want to use my own class to hold value of XML
>> simple
>> type. The JAXB 2.2 spec says that xs:anySimpleType is mapped to both
>> java.lang.Object and java.lang.String. It is not completely clear to me
>> how
>> JAXB implementation should choose String over Object and vice versa.
>>
>> I would expect that xsi:type controls this so that if concrete type like
>> xs:int specified, then the value is of Java int type (probably boxed in
>> java.lang.Integer). However, the behavior that I see is that the type is
>> always java.lang.String. When I specify something like
>>
>> @XmlValue
>> @XmlSchemaType(name = "anySimpleType")
>> protected Object value
>>
>> I expect JAXB implementation to perform type substitution based on the
>> xsi:type attribute.
>>
>> I am wondering if this area is not covered by JAXB so I cannot expect
>> type
>> substitution to work for the case above.
>>
>>
>> Wolfgang Laun-2 wrote:
>>>
>>> You could use a class resulting from the following XML schema:
>>>
>>> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>>>            version="2.0">
>>>   <xs:element name="doc" type="DocType"/>
>>>   <xs:complexType name="DocType">
>>>     <xs:sequence>
>>>       <xs:element name="field" type="xs:anySimpleType"/>
>>>     </xs:sequence>
>>>     <xs:attribute name="name" type="xs:string"/>
>>>   </xs:complexType>
>>> </xs:schema>
>>>
>>> Setting the Object field to an Integer and marshalling results in
>>>   <doc name="integer">
>>>       <field xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>> xmlns:xs="http://www.w3.org/2001/XMLSchema"
>>> xsi:type="xs:int">42</field>
>>>   </doc>
>>> and this unmarshals properly.
>>>
>>> I don't think it's possible to have also an attribute in the element
>>> which has anySimpleType as its @XmlSchemaType. For this the XML Schema
>>> type would have to be a complex type.
>>>
>>> -W
>>>
>>>
>>>
>>> On Sun, May 2, 2010 at 9:49 AM, zeiss <zeiss_at_tut.by> wrote:
>>>>
>>>> Hi,
>>>>
>>>> I need to unmarshal XML element value to a field of type Object. I also
>>>> would like JAXB implementation to automatically handle type information
>>>> I
>>>> provide in XML with xsi:type attribute. The result would be an object
>>>> of
>>>> corresponding type as defined by XML data types to Java classes
>>>> mapping.
>>>>
>>>> Unfortunately, JAXB implementation that I am using (JAXB RI 2.2) seems
>>>> to
>>>> ignore xsi:type in my case. It always creates an object of type String.
>>>> I
>>>> am
>>>> wondering if I can get the desired result at all when using xsi:type
>>>> information.
>>>>
>>>> Here is a simple sample:
>>>>
>>>> <field name="field1" xsi:type="xs:integer"
>>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>>> xmlns:xs="http://www.w3.org/2001/XMLSchema">1</field>
>>>>
>>>> @XmlRootElement(name = "field")
>>>> public class Field {
>>>>
>>>>  private String name;
>>>>
>>>>  private Object value;
>>>>
>>>>  @XmlAttribute(name = "name")
>>>>  public String getName() {
>>>>    return name;
>>>>  }
>>>>
>>>>  public void setName(String name) {
>>>>    this.name = name;
>>>>  }
>>>>
>>>>  @XmlValue
>>>>  @XmlSchemaType(name = "anySimpleType")
>>>>  public Object getValue() {
>>>>    return value;
>>>>  }
>>>>
>>>>  public void setValue(Object value) {
>>>>    this.value = value;
>>>>  }
>>>> }
>>>> --
>>>> View this message in context:
>>>> http://old.nabble.com/Ummarshalling-to-Object-type-tp28425349p28425349.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
>>>>
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> 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://old.nabble.com/Ummarshalling-to-Object-type-tp28425349p28433140.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
>>
>>
>
> ---------------------------------------------------------------------
> 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://old.nabble.com/Ummarshalling-to-Object-type-tp28425349p28434520.html
Sent from the java.net - jaxb users mailing list archive at Nabble.com.