On 05/07/2013 05:46 PM, Sergey Beryozkin wrote:



-------------------
jsonp example
(http://people.apache.org/~gmazza/restexamples/jsonp.html):
After deploying via "mvn clean compile exec:java", the last cURL
statement in the above HTML:

2.7.5-SNAPSHOT returns this error:
gmazza@gmazza-work:/media/work1/jersey-samples-on-cxf/jsonp$ curl
-HAccept:application/x+javascript
http://localhost:9998/jsonp/changes?_jsonp=myCallback
myCallback(No message body writer has been found for response class
LinkedList.)

In CXF 2.7.5 the refactoring has been made which exposed some issues
with JSONP setups (I recall I had to do something similar in our
system tests), looks like in this case you have
https://github.com/gmazza/jersey-samples-on-cxf/blob/master/jsonp/src/main/java/com/sun/jersey/samples/jsonp/Main.java


JSONP in interceptors 'accepting' application/json, but it needs to
match "application/x+javascript", the actual value of HTTP Accept


No luck. I checked in the change to the Main method given above and
tried with CXF 2.7.6-SNAPSHOT, but the same error occurs.


2.6.7 works:
gmazza@gmazza-work:/media/work1/jersey-samples-on-cxf/jsonp$ curl
-HAccept:application/x+javascript
http://localhost:9998/jsonp/changes?_jsonp=myCallback
myCallback([{"madeByAdmin":false,"linesChanged":2,"logMessage":"title
\"User Guide\"
updated"},{"madeByAdmin":true,"linesChanged":1,"logMessage":"fixed
metadata"},{"madeByAdmin":false,"linesChanged":91,"logMessage":"added
index"},{"madeByAdmin":false,"linesChanged":650,"logMessage":"\"Troubleshoothing\"

chapter"},{"madeByAdmin":false,"linesChanged":1,"logMessage":"fixing
typo"}]);gmazza@gmazza-work:/media/work1/jersey-samples-on-cxf/jsonp$
-------------------

Ok, I've looked into it closer. The reason it did not work with CXF 2.7.6 was that Jackson provider is not typed to support application/x+javascript. Setting "application/json" on JSONP in interceptor is needed to get the runtime successfully selecting the Jackson provider, however in CXF 2.7.6 the way the response type is handled has changed (in the better way), so what happened was that JSONP out pre-stream interceptor was actually setting

"application/x+javascript" (so that a proper response type is returned), but it does it too early actually though that worked in CXF 2.6.7 as this type was not affecting the selection of MBW.

Basically, if you update your example to set a mediaType property on the out stream interceptor as "application/json" the example will start working, but that will return "application/json" content type to the browser.

I've just added JAX-RS 2.0 out filter which should be used from now on, it will set a response content type after Jackson has been selected but before it is actually invoked, in the end resulting in a proper content type returned too, so remove

bean.getOutInterceptors().add(new JsonpPreStreamInterceptor());

and add

providerList.add(new org.apache.cxf.jaxrs.provider.jsonp.JsonpJaxrsWriterInterceptor());

It is a long story :-), but it has become better. And IMHO is still cleaner than using JSONPadding objects within the application code



Hmm, I made the change:
https://github.com/gmazza/jersey-samples-on-cxf/commit/811d97be876286bfe62f2bc2e13667a25a0e5bfd

But still isn't working:
curl -HAccept:application/x+javascript http://localhost:9998/jsonp/changes?_jsonp=myCallback
No message body writer has been found for response class LinkedList.);


Reply via email to