You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Guy Pardon <gu...@atomikos.com> on 2011/12/11 09:57:48 UTC

Supporting custom JSON formats

Hi,

I am trying to define a custom hypermedia model (cf REST in Practice) as the return type of my REST service. 

With MIME type "application/json" this works, but with type "application/vnd.example-com.foo+json" (which is what I want) this fails, however. Calling the service URL gives:

"org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage
WARNING: No message body writer has been found for response class ListResult."

My service method:

	@GET
	@Path("list")
	@Produces("application/vnd.example-com.foo+json")
	public ListResult retrieveList() {
		return new ListResult();
	}

My configuration code looks like this:

	JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
        JSONProvider prov = new JSONProvider();

	// setting custom mime types does not seem to work?
        List<String> mimeTypes = new ArrayList<String>();
        mimeTypes.add("application/vnd.example-com.foo+json");
        mimeTypes.add("application/json");
        prov.setProduceMediaTypes(mimeTypes);

	// following is regular CXF config as usual
        prov.setDropRootElement(true);
        sf.setProvider(prov);
        sf.setResourceClasses(ListService.class);
        sf.setResourceProvider(ListService.class, 
            new SingletonResourceProvider(new ListService()));
        sf.setAddress("http://localhost:9000/");
        sf.create();


Did I miss anything? I am using CXF 2.4.1...

Thanks
Guy

Re: Supporting custom JSON formats

Posted by Guy Pardon <gu...@atomikos.com>.
You're welcome. CXF rocks:-)

Guy

On 14-dec-2011, at 22:48, Sergey Beryozkin wrote:


On 14/12/11 18:44, Guy Pardon wrote:
> My mistake,
> 
> Tried again and somehow it worked where it didn't before. Not sure what I did wrong, sorry.

no problems, thanks for trying it,
Sergey

> 
> Guy
> 
> On 12-dec-2011, at 11:20, Sergey Beryozkin wrote:
> 
> Hi Guy
> 
> On 11/12/11 08:57, Guy Pardon wrote:
>> Hi,
>> 
>> I am trying to define a custom hypermedia model (cf REST in Practice) as the return type of my REST service.
>> 
>> With MIME type "application/json" this works, but with type "application/vnd.example-com.foo+json" (which is what I want) this fails, however. Calling the service URL gives:
>> 
>> "org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage
>> WARNING: No message body writer has been found for response class ListResult."
>> 
>> My service method:
>> 
>> 	@GET
>> 	@Path("list")
>> 	@Produces("application/vnd.example-com.foo+json")
>> 	public ListResult retrieveList() {
>> 		return new ListResult();
>> 	}
>> 
>> My configuration code looks like this:
>> 
>> 	JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
>>         JSONProvider prov = new JSONProvider();
>> 
>> 	// setting custom mime types does not seem to work?
>>         List<String>   mimeTypes = new ArrayList<String>();
>>         mimeTypes.add("application/vnd.example-com.foo+json");
>>         mimeTypes.add("application/json");
>>         prov.setProduceMediaTypes(mimeTypes);
>> 
>> 	// following is regular CXF config as usual
>>         prov.setDropRootElement(true);
>>         sf.setProvider(prov);
>>         sf.setResourceClasses(ListService.class);
>>         sf.setResourceProvider(ListService.class,
>>             new SingletonResourceProvider(new ListService()));
>>         sf.setAddress("http://localhost:9000/");
>>         sf.create();
>> 
>> 
>> Did I miss anything? I am using CXF 2.4.1...
> 
> I've updated one of the existing tests on the trunk and it works fine for me, here is a trace:
> ----------------------------
> ID: 1
> Address: http://localhost:9000/the/bookstore/books/123
> Http-Method: GET
> Content-Type: */*
> Headers: {Accept=[application/vnd.example-com.foo+json], accept-encoding=[gzip;q=1.0, identity; q=0.5, *;q=0], Cache-Control=[no-cache], connection=[keep-alive], content-type=[*/*], Host=[localhost:9000], Pragma=[no-cache], User-Agent=[Java/1.6.0_26]}
> --------------------------------------
> 12-Dec-2011 10:15:28 org.apache.cxf.interceptor.LoggingOutInterceptor
> INFO: Outbound Message
> ---------------------------
> ID: 1
> Response-Code: 200
> Content-Type: application/vnd.example-com.foo+json
> Headers: {Date=[Mon, 12 Dec 2011 10:15:28 GMT]}
> Payload: {"Book":{"id":123,"name":"CXF in Action"}}
> 
> I set produceMediaTypes on JSONProvider (from Spring),
> can you confirm please
> Accept: application/vnd.example-com.foo+json
> 
> is set on the wire, LoggingInInterceptor can help
> 
> Cheers, Sergey


Re: Supporting custom JSON formats

Posted by Sergey Beryozkin <sb...@gmail.com>.
On 14/12/11 18:44, Guy Pardon wrote:
> My mistake,
>
> Tried again and somehow it worked where it didn't before. Not sure what I did wrong, sorry.

no problems, thanks for trying it,
Sergey

>
> Guy
>
> On 12-dec-2011, at 11:20, Sergey Beryozkin wrote:
>
> Hi Guy
>
> On 11/12/11 08:57, Guy Pardon wrote:
>> Hi,
>>
>> I am trying to define a custom hypermedia model (cf REST in Practice) as the return type of my REST service.
>>
>> With MIME type "application/json" this works, but with type "application/vnd.example-com.foo+json" (which is what I want) this fails, however. Calling the service URL gives:
>>
>> "org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage
>> WARNING: No message body writer has been found for response class ListResult."
>>
>> My service method:
>>
>> 	@GET
>> 	@Path("list")
>> 	@Produces("application/vnd.example-com.foo+json")
>> 	public ListResult retrieveList() {
>> 		return new ListResult();
>> 	}
>>
>> My configuration code looks like this:
>>
>> 	JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
>>          JSONProvider prov = new JSONProvider();
>>
>> 	// setting custom mime types does not seem to work?
>>          List<String>   mimeTypes = new ArrayList<String>();
>>          mimeTypes.add("application/vnd.example-com.foo+json");
>>          mimeTypes.add("application/json");
>>          prov.setProduceMediaTypes(mimeTypes);
>>
>> 	// following is regular CXF config as usual
>>          prov.setDropRootElement(true);
>>          sf.setProvider(prov);
>>          sf.setResourceClasses(ListService.class);
>>          sf.setResourceProvider(ListService.class,
>>              new SingletonResourceProvider(new ListService()));
>>          sf.setAddress("http://localhost:9000/");
>>          sf.create();
>>
>>
>> Did I miss anything? I am using CXF 2.4.1...
>
> I've updated one of the existing tests on the trunk and it works fine for me, here is a trace:
> ----------------------------
> ID: 1
> Address: http://localhost:9000/the/bookstore/books/123
> Http-Method: GET
> Content-Type: */*
> Headers: {Accept=[application/vnd.example-com.foo+json], accept-encoding=[gzip;q=1.0, identity; q=0.5, *;q=0], Cache-Control=[no-cache], connection=[keep-alive], content-type=[*/*], Host=[localhost:9000], Pragma=[no-cache], User-Agent=[Java/1.6.0_26]}
> --------------------------------------
> 12-Dec-2011 10:15:28 org.apache.cxf.interceptor.LoggingOutInterceptor
> INFO: Outbound Message
> ---------------------------
> ID: 1
> Response-Code: 200
> Content-Type: application/vnd.example-com.foo+json
> Headers: {Date=[Mon, 12 Dec 2011 10:15:28 GMT]}
> Payload: {"Book":{"id":123,"name":"CXF in Action"}}
>
> I set produceMediaTypes on JSONProvider (from Spring),
> can you confirm please
> Accept: application/vnd.example-com.foo+json
>
> is set on the wire, LoggingInInterceptor can help
>
> Cheers, Sergey
>
>
>>
>> Thanks
>> Guy
>
>

Re: Supporting custom JSON formats

Posted by Guy Pardon <gu...@me.com>.
My mistake,

Tried again and somehow it worked where it didn't before. Not sure what I did wrong, sorry.

Guy

On 12-dec-2011, at 11:20, Sergey Beryozkin wrote:

Hi Guy

On 11/12/11 08:57, Guy Pardon wrote:
> Hi,
> 
> I am trying to define a custom hypermedia model (cf REST in Practice) as the return type of my REST service.
> 
> With MIME type "application/json" this works, but with type "application/vnd.example-com.foo+json" (which is what I want) this fails, however. Calling the service URL gives:
> 
> "org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage
> WARNING: No message body writer has been found for response class ListResult."
> 
> My service method:
> 
> 	@GET
> 	@Path("list")
> 	@Produces("application/vnd.example-com.foo+json")
> 	public ListResult retrieveList() {
> 		return new ListResult();
> 	}
> 
> My configuration code looks like this:
> 
> 	JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
>         JSONProvider prov = new JSONProvider();
> 
> 	// setting custom mime types does not seem to work?
>         List<String>  mimeTypes = new ArrayList<String>();
>         mimeTypes.add("application/vnd.example-com.foo+json");
>         mimeTypes.add("application/json");
>         prov.setProduceMediaTypes(mimeTypes);
> 
> 	// following is regular CXF config as usual
>         prov.setDropRootElement(true);
>         sf.setProvider(prov);
>         sf.setResourceClasses(ListService.class);
>         sf.setResourceProvider(ListService.class,
>             new SingletonResourceProvider(new ListService()));
>         sf.setAddress("http://localhost:9000/");
>         sf.create();
> 
> 
> Did I miss anything? I am using CXF 2.4.1...

I've updated one of the existing tests on the trunk and it works fine for me, here is a trace:
----------------------------
ID: 1
Address: http://localhost:9000/the/bookstore/books/123
Http-Method: GET
Content-Type: */*
Headers: {Accept=[application/vnd.example-com.foo+json], accept-encoding=[gzip;q=1.0, identity; q=0.5, *;q=0], Cache-Control=[no-cache], connection=[keep-alive], content-type=[*/*], Host=[localhost:9000], Pragma=[no-cache], User-Agent=[Java/1.6.0_26]}
--------------------------------------
12-Dec-2011 10:15:28 org.apache.cxf.interceptor.LoggingOutInterceptor
INFO: Outbound Message
---------------------------
ID: 1
Response-Code: 200
Content-Type: application/vnd.example-com.foo+json
Headers: {Date=[Mon, 12 Dec 2011 10:15:28 GMT]}
Payload: {"Book":{"id":123,"name":"CXF in Action"}}

I set produceMediaTypes on JSONProvider (from Spring),
can you confirm please
Accept: application/vnd.example-com.foo+json

is set on the wire, LoggingInInterceptor can help

Cheers, Sergey


> 
> Thanks
> Guy


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com


Re: Supporting custom JSON formats

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi Guy

On 11/12/11 08:57, Guy Pardon wrote:
> Hi,
>
> I am trying to define a custom hypermedia model (cf REST in Practice) as the return type of my REST service.
>
> With MIME type "application/json" this works, but with type "application/vnd.example-com.foo+json" (which is what I want) this fails, however. Calling the service URL gives:
>
> "org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor writeResponseErrorMessage
> WARNING: No message body writer has been found for response class ListResult."
>
> My service method:
>
> 	@GET
> 	@Path("list")
> 	@Produces("application/vnd.example-com.foo+json")
> 	public ListResult retrieveList() {
> 		return new ListResult();
> 	}
>
> My configuration code looks like this:
>
> 	JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
>          JSONProvider prov = new JSONProvider();
>
> 	// setting custom mime types does not seem to work?
>          List<String>  mimeTypes = new ArrayList<String>();
>          mimeTypes.add("application/vnd.example-com.foo+json");
>          mimeTypes.add("application/json");
>          prov.setProduceMediaTypes(mimeTypes);
>
> 	// following is regular CXF config as usual
>          prov.setDropRootElement(true);
>          sf.setProvider(prov);
>          sf.setResourceClasses(ListService.class);
>          sf.setResourceProvider(ListService.class,
>              new SingletonResourceProvider(new ListService()));
>          sf.setAddress("http://localhost:9000/");
>          sf.create();
>
>
> Did I miss anything? I am using CXF 2.4.1...

I've updated one of the existing tests on the trunk and it works fine 
for me, here is a trace:
----------------------------
ID: 1
Address: http://localhost:9000/the/bookstore/books/123
Http-Method: GET
Content-Type: */*
Headers: {Accept=[application/vnd.example-com.foo+json], 
accept-encoding=[gzip;q=1.0, identity; q=0.5, *;q=0], 
Cache-Control=[no-cache], connection=[keep-alive], content-type=[*/*], 
Host=[localhost:9000], Pragma=[no-cache], User-Agent=[Java/1.6.0_26]}
--------------------------------------
12-Dec-2011 10:15:28 org.apache.cxf.interceptor.LoggingOutInterceptor
INFO: Outbound Message
---------------------------
ID: 1
Response-Code: 200
Content-Type: application/vnd.example-com.foo+json
Headers: {Date=[Mon, 12 Dec 2011 10:15:28 GMT]}
Payload: {"Book":{"id":123,"name":"CXF in Action"}}

I set produceMediaTypes on JSONProvider (from Spring),
can you confirm please
Accept: application/vnd.example-com.foo+json

is set on the wire, LoggingInInterceptor can help

Cheers, Sergey


>
> Thanks
> Guy


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com