Hi
Well, your custom provider says that it produces application/xml but
actually writes JSON hence JSON is produced.
I'm not quite sure why you've decided to do a custom provider. Just having
@GET
@Path("/projects/{id}")
@Produces("application/xml")
public Project getProject(@PathParam("id") int id, @Context
HttpHeaders headers) {}
should produce XML, there's a default JAXB provider available. Later on you
can update @Produces and add application/json to it....
cheers, Sergey
Raphaël Flores-2 wrote:
>
> Hello all.
>
> With CXF, I'd like to map my java objects to XML (and later to Json) in
> order to send the (streaming) XML to a client. This client might use
> JAXB, without any CXF dependances. Currently, I don't use WSDL either
> Spring, just CXF HTTP annotation with a web.xml servlet for the
> deployment, simply.
>
> I've taken exemple on BadgerFishProvider to construct the provider I
> need for my app, the code is below:
>
> ============================================================
> @Produces("application/xml")
> @Consumes("application/xml")
> @Provider
> public final class BadgerFishProvider implements
> MessageBodyWriter<ServerProject> {
>
> private static Map<Class, JAXBContext> jaxbContexts = new
> WeakHashMap<Class, JAXBContext>();
> @Context private HttpHeaders requestHeaders;
>
> public long getSize(ServerProject project, Class<?> type, Type
> genericType, Annotation[] annotations, MediaType m) {
> return -1; }
>
> public boolean isWriteable(Class<?> type, Type genericType,
> Annotation[] annotations, MediaType m) {
> return type.getAnnotation(XmlRootElement.class) != null; }
>
> public void writeTo(ServerProject project, Class<?> clazz, Type
> genericType, Annotation[] annotations, MediaType m,
> MultivaluedMap<String, Object> headers, OutputStream os)
> throws IOException, WebApplicationException {
> try {
> JAXBContext context = getJAXBContext(project.getClass());
> Marshaller marshaller = context.createMarshaller();
>
> XMLOutputFactory factory = new BadgerFishXMLOutputFactory();
> XMLStreamWriter xsw = factory.createXMLStreamWriter(os);
> marshaller.marshal(project, xsw);
> xsw.close(); }
> catch (JAXBException e) { e.printStackTrace(); }
> catch (XMLStreamException e) { e.printStackTrace();
> }
> }
>
> private JAXBContext getJAXBContext(Class type) throws JAXBException {
> synchronized (jaxbContexts) {
> JAXBContext context = jaxbContexts.get(type);
> if (context == null) {
> context = JAXBContext.newInstance(type);
> jaxbContexts.put(type, context);
> } return context; }
> }
> }
> ============================================================
>
> The ServerProject class right has the @XmlRootElement(name =
> "ServerProject") tag and it extends a class Project which contains all
> attributes and getters and setters.
>
> Here is the method used at frontend :
>
> ============================================================
> @GET
> @Path("/projects/{id}")
> @Produces("application/xml")
> public Project getProject(@PathParam("id") int id, @Context
> HttpHeaders headers) throws Base64Exception, IOException {
> ...
> try {
> Project project = factory.getProject(user, id);
> return project;
> }
> ...
> }
> ============================================================
>
> The problem is that marshalled data is JSON instead of being XML.Here is
> the result sent by my app:
>
> {"ServerProject":{"dbId":{"$":"128"},"logId":{"$":"0"},"projectId":{"$":"128"},"private":{"$":"false"},"projectDescription":{"$":""},"projectName":{"$":"MAIZEGS"},"remark":{"$":""}}}
>
>
> I don't understand why Json is produced while all seems to expect XML
> data... Does anyone know why ? And if i'm wrong concerning the way I use
> to marshall my data with JaxB, do not hesitate to warn me, i'm not sure
> to have the good approach.
>
> Thanks for your attention.
>
> --
> Raphaël Flores
>
>
>
--
View this message in context:
http://www.nabble.com/Getting-JSON-instead-of-XML-at-marshalling-step-tp25076341p25080514.html
Sent from the cxf-user mailing list archive at Nabble.com.