cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: JAX-RS and Collections of JAXB objects (was: Help required with apache cxf multiparts)
Date Wed, 06 Oct 2010 20:03:49 GMT
Hi Josh, this is nice - I honestly was not sure if it will work or not :-)

By the way, 500 is correct for a missing writer, according to [1]

cheers, Sergey

[1]
https://jsr311.dev.java.net/nonav/releases/1.1/spec/spec3.html#x3-440004.2.2

On Wed, Oct 6, 2010 at 10:21 AM, Josh Holtzman <jholtzman@berkeley.edu>wrote:

> Thank you for the hint!  Returning a GenericEntity wrapped collection also
> works, as you suggested.
>
> @GET
> @Path("/jobs.xml")
> @Produces(MediaType.APPLICATION_XML)
> public Response getJobs() {
>  GenericEntity<List<JobImpl>> entity = new
> GenericEntity<List<JobImpl>>(getJobs()) {};
>  return Response.ok(entity).build();
> }
>
> Thanks,
> Josh
>
> On Wed, Oct 6, 2010 at 10:48 AM, Sergey Beryozkin <sberyozkin@gmail.com
> >wrote:
>
> > Cool, thanks for the confirmation...
> >
> > cheers, Sergey
> >
> >
> > On 10/6/10, Josh Holtzman <jholtzman@berkeley.edu> wrote:
> > >
> > > It looks like the problem is in returning a Response with the
> Collection
> > > set
> > > as the entity, as described below.  Changing the return type to
> > > List<JobImpl> works as expected.
> > >
> > > Thanks,
> > > Josh
> > >
> > > On Wed, Oct 6, 2010 at 10:10 AM, Josh Holtzman <jholtzman@berkeley.edu
> > > >wrote:
> > >
> > > > When I do this:
> > > >
> > > >   @GET
> > > >   @Path("/jobs.xml")
> > > >   @Produces(MediaType.APPLICATION_XML)
> > > >   public Response getJobs() {
> > > >     return Response.ok(getJobsImpls()).build();
> > > >   }
> > > >
> > > > @XmlType(name = "job", namespace = "
> http://remote.opencastproject.org/
> > ")
> > > > @XmlRootElement(name = "job", namespace = "
> > > > http://remote.opencastproject.org/")
> > > > public class JobImpl implements Job {
> > > >    ...
> > > > }
> > > >
> > > >
> > > > I get a 500 response with this in the body "No message body writer
> has
> > > been
> > > > found for response class Vector."  I thought maybe the problem was
> that
> > > this
> > > > Vector is the one being returned by eclipselink, and there was some
> > kind
> > > of
> > > > proxy voodoo interfering.  If I copy all of the JobImpls into a new
> > > > ArrayList, I get the same kind of message, "No message body writer
> has
> > > been
> > > > found for response class ArrayList."
> > > >
> > > > I'm building the JAX-RS endpoint manually using
> > > cxf-bundle-jaxrs-2.2.9.jar
> > > > and a CXFNonSpringServlet with some custom providers.  Perhaps I'm
> > > missing
> > > > one of the providers needed to handle Collections?
> > > >
> > > > And I'm curious, what would the xml look like for this collection?
> >  Where
> > > > does the root element name come from?  And the namespace... is it
> > copied
> > > > from the objects in the collection?
> > > >
> > > > Thanks,
> > > > Josh
> > > >
> > > > On Tue, Oct 5, 2010 at 11:20 PM, Sergey Beryozkin <
> > sberyozkin@gmail.com
> > > >wrote:
> > > >
> > > >> Hi Josh
> > > >>
> > > >> thanks for this tip, but my question is to do with you referring to
> > > >> collections of JAXB beans not being supported.
> > > >> I'd appreciate if you could send me an example of such a collection.
> > > >> Explicit collection have been supported for a while and I recall
> users
> > > >> confirming that it worked for them, so if there's some issue there
> > > lurking
> > > >> then I'd like to get it fixed :-)
> > > >>
> > > >> thanks, Sergey
> > > >>
> > > >> On Tue, Oct 5, 2010 at 7:24 PM, Josh Holtzman <
> jholtzman@berkeley.edu
> > > >> >wrote:
> > > >>
> > > >> > This part of the stack trace:
> > > >> >
> > > >> > Caused by: javax.ws.rs.WebApplicationException at
> > > >> >
> > > >> >
> > > >>
> > >
> >
> org.apache.cxf.jaxrs.client.AbstractClient.reportNoMessageHandler(AbstractClient.java:487)
> > > >> >
> > > >> > looks like there's no message body writer.  I've run into this
> kind
> > of
> > > >> > problem when trying to return Collections, even collections of
> JAXB
> > > >> > elements, from JAX-RS endpoints.  I usually solve it by wrapping
> the
> > > >> list
> > > >> > in
> > > >> > a root class, and passing the wrapper rather than the Collection,
> > like
> > > >> > this:
> > > >> >
> > > >> > @XmlRootElement(name="deviceList")
> > > >> > public class DeviceList {
> > > >> >  @XmlElement
> > > >> >  protected List<Device> devices;
> > > >> > }
> > > >> >
> > > >> > Perhaps this might help in your case too, switching from
> > > >> > addDevice(List<Device> device) to addDevice(DeviceList
> deviceList).
> > > >> >
> > > >> > Josh
> > > >> >
> > > >> > On Tue, Oct 5, 2010 at 8:00 PM, oceanz <oceanz_seven@yahoo.com>
> > > wrote:
> > > >> >
> > > >> > >
> > > >> > > I changed it to:
> > > >> > >         @Path("user/site/plant/device/addDevice1")
> > > >> > >        @POST
> > > >> > >        @Produces("text/xml")
> > > >> > >         @Consumes("multipart/form-data;type=text/xml")
> > > >> > >        Device addDevice(List<Device> device);
> > > >> > >
> > > >> > > But it still doesn't work.
> > > >> > > Same exception:Caused by: javax.ws.rs.WebApplicationException
> > > >> > >         at
> > > >> > >
> > > >> > >
> > > >> >
> > > >>
> > >
> >
> org.apache.cxf.jaxrs.client.AbstractClient.reportNoMessageHandler(AbstractClient.java:487)
> > > >> > >        at
> > > >> > >
> > > >> > >
> > > >> >
> > > >>
> > >
> >
> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:401)
> > > >> > >        at
> > > >> > >
> > > >> > >
> > > >> >
> > > >>
> > >
> >
> org.apache.cxf.jaxrs.client.ClientProxyImpl$BodyWriter.handleMessage(ClientProxyImpl.java:514)
> > > >> > >        ... 5 more
> > > >> > >
> > > >> > > Device is a JAXB Bean.:
> > > >> > > @Entity(name="device")
> > > >> > > @XmlRootElement(name="device")
> > > >> > > @XmlAccessorType(XmlAccessType.FIELD)
> > > >> > > public class Device extends DomainEntity {
> > > >> > >
> > > >> > >        /**
> > > >> > >         *
> > > >> > >         */
> > > >> > >        private static final long serialVersionUID = 1L;
> > > >> > >
> > > >> > >        public Device() {}
> > > >> > >
> > > >> > >
> > > >> > >        @XmlAttribute(name="deviceName")
> > > >> > >        private String deviceName;
> > > >> > >
> > > >> > >        @XmlAttribute(name="deviceType")
> > > >> > >        private String deviceType;
> > > >> > >
> > > >> > >        @XmlAttribute(name="modelNumber")
> > > >> > >        private String modelNumber;
> > > >> > >
> > > >> > >        @XmlAttribute(name="serialNumber")
> > > >> > >        private String serialNumber;
> > > >> > >        ..........
> > > >> > > }
> > > >> > >
> > > >> > > Who do I need to do next? Desparate to get this working.
> > > >> > > Thanks for all your help.
> > > >> > > --
> > > >> > > View this message in context:
> > > >> > >
> > > >> >
> > > >>
> > >
> >
> http://cxf.547215.n5.nabble.com/Help-required-with-apache-cxf-multiparts-tp3199975p3200103.html
> > > >> > > Sent from the cxf-user mailing list archive at Nabble.com.
> > > >> > >
> > > >> >
> > > >>
> > > >
> > > >
> > >
> >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message