Thanks Marc for the suggestion. It works like a charm now.
I was able to find the condition used by XJC for the JAXB behavior I
encountered. I found this blog entry useful
(
http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html)
which explains the reasons behind this behavior.
Cheers!
Arul.
Marc Hadley wrote:
> On May 12, 2008, at 11:52 AM, Arul Dhesiaseelan wrote:
>>
>> Thanks for the great help. I would like to fix the schema so that it
>> generates the @XmlRootElement in my JAXB type. What am I missing in
>> this schema to achieve this behavior?
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <xs:schema attributeFormDefault="unqualified"
>> elementFormDefault="qualified"
>> xmlns:xs="http://www.w3.org/2001/XMLSchema">
>> <xs:element name="rows" type="rowsType"/>
>> <xs:complexType name="rowsType">
>> <xs:sequence>
>> <xs:element type="rowType" name="row" maxOccurs="unbounded"
>> minOccurs="0"/>
>> </xs:sequence>
>> </xs:complexType>
>
> Hmm, I would have thought that would work. What happens if you change
> it to:
>
> <xs:element name="rows">
> <xs:complexType>
> <xs:sequence>
> <xs:element type="rowType" name="row" maxOccurs="unbounded"
> minOccurs="0"/>
> </xs:sequence>
> </xs:complexType>
> <xs:element>
>
> Marc.
>
>
>>
>> <xs:complexType name="cellType">
>> <xs:simpleContent>
>> <xs:extension base="xs:string">
>> <xs:attribute type="xs:string" name="image" use="optional"/>
>> </xs:extension>
>> </xs:simpleContent>
>> </xs:complexType>
>> <xs:complexType name="userdataType">
>> <xs:simpleContent>
>> <xs:extension base="xs:string">
>> <xs:attribute type="xs:string" name="name" use="optional"/>
>> </xs:extension>
>> </xs:simpleContent>
>> </xs:complexType>
>> <xs:complexType name="rowType">
>> <xs:sequence>
>> <xs:element type="userdataType" name="userdata"
>> maxOccurs="unbounded" minOccurs="0"/>
>> <xs:element type="cellType" name="cell" maxOccurs="unbounded"
>> minOccurs="0"/>
>> <xs:element type="rowType" name="row" maxOccurs="unbounded"
>> minOccurs="0"/>
>> </xs:sequence>
>> <xs:attribute type="xs:string" name="id" use="optional"/>
>> <xs:attribute type="xs:string" name="open" use="optional"/>
>> </xs:complexType>
>> </xs:schema>
>>
>> Thanks!
>> Arul
>>
>> Marc Hadley wrote:
>>> You should be able to return JAXBElement<RowsType> instead. The
>>> problem is that RowsType doesn't have an @XmlRootElement annotation
>>> so Jersey doesn't know what element name to use for the instance of
>>> the schema type. Another alternative is to add a global element
>>> declaration to the schema for an element of the RowsType schema
>>> type, JAXB will then generate a class annotated with @XmlRootElement
>>> that you can return directly.
>>>
>>> Marc.
>>>
>>>
>>> On May 12, 2008, at 11:26 AM, Arul Dhesiaseelan wrote:
>>>
>>>> Hello,
>>>>
>>>> I am implementing a Rest service using Jersey which uses Java
>>>> classes generated from JAXB. My method returns a JAXB type
>>>> 'RowsType' which is a list of 'RowType' elements. My method looks
>>>> like:
>>>>
>>>> @GET
>>>> @Path("/list")
>>>> @ProduceMime({"application/json", "application/xml"})
>>>> public RowsType getRows() throws IOException {
>>>> final RowsType list;
>>>> list = processRows();
>>>> return list;
>>>> }
>>>>
>>>>
>>>> private RowsType processRows() {
>>>> List rowList = new ArrayList();
>>>> for (Customer customer : customers.values()) {
>>>> RowType row1 = new RowType();
>>>> row1.setId(customer.getId());
>>>> for (Product product : products.values()) {
>>>> if (customer.getId().equals(product.getCustomerID())) {
>>>> final String productId = Long.toString(product.getId());
>>>>
>>>> RowType row11 = new RowType();
>>>> row11.setId(productId);
>>>>
>>>> row1.getRow().add(row11);
>>>> }
>>>>
>>>> }
>>>> rowList.add(row1);
>>>> }
>>>> RowsType rows = new RowsType();
>>>> rows.getRow().addAll(rowList);
>>>> return rows;
>>>> }
>>>>
>>>>
>>>> The JAXB generated class from the schema is shown below.
>>>>
>>>> public class RowsType {
>>>> protected List<RowType> row;
>>>>
>>>> /**
>>>> * Gets the value of the row property.
>>>> *
>>>> * <p>
>>>> * This accessor method returns a reference to the live list,
>>>> * not a snapshot. Therefore any modification you make to the
>>>> * returned list will be present inside the JAXB object.
>>>> * This is why there is not a <CODE>set</CODE> method for the row
>>>> property.
>>>> *
>>>> * <p>
>>>> * For example, to add a new item, do as follows:
>>>> * <pre>
>>>> * getRow().add(newItem);
>>>> * </pre>
>>>> *
>>>> *
>>>> * <p>
>>>> * Objects of the following type(s) are allowed in the list
>>>> * {_at_link RowType }
>>>> *
>>>> *
>>>> */
>>>> public List<RowType> getRow() {
>>>> if (row == null) {
>>>> row = new ArrayList<RowType>();
>>>> }
>>>> return this.row;
>>>> }
>>>>
>>>> }
>>>>
>>>> When I try to start the REST service and invoke the "list"
>>>> operation, I see the following message on the console.
>>>>
>>>> May 12, 2008 9:23:52 AM
>>>> com.sun.ws.rest.impl.application.MessageBodyFactory
>>>> getMessageBodyWriter
>>>> SEVERE: A message body writer for Java type, class
>>>> impl.products.jaxb.generated.RowsType, and MIME media type,
>>>> application/xml, was not found
>>>>
>>>> How do I implement a MessageBodyWriter for the above JAXB generated
>>>> type RowsType?
>>>>
>>>> Please clarify this behavior.
>>>>
>>>> Thanks!
>>>> Arul
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
>>>> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>>>>
>>>
>>> ---
>>> Marc Hadley <marc.hadley at sun.com>
>>> CTO Office, Sun Microsystems.
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
>>> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>>>
>>>
>>> ________________________________
>>> Scanned by MessageLabs for Flux
>>> ________________________________
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
>> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>>
>
> ---
> Marc Hadley <marc.hadley at sun.com>
> CTO Office, Sun Microsystems.
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe_at_jersey.dev.java.net
> For additional commands, e-mail: users-help_at_jersey.dev.java.net
>
>
> ________________________________
> Scanned by MessageLabs for Flux
> ________________________________