users@jersey.java.net

Re: [Jersey] JSONP Callback support

From: Farrukh Najmi <farrukh_at_wellfleetsoftware.com>
Date: Tue, 03 Feb 2009 13:17:59 -0500

Paul Sandoz wrote:
> On Feb 3, 2009, at 3:21 AM, Farrukh Najmi wrote:
>
>>> <servlet>
>>> <servlet-name>Registry REST Interface</servlet-name>
>>>
>>> <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
>>>
>>> <init-param>
>>>
>>> <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
>>>
>>> <param-value>xxx.SomeClass.JSONCallbackResponseFilter</param-value>
>>> </init-param>
>>> <load-on-startup>4</load-on-startup>
>>> </servlet>
>>>
>>> What I am finding is that the ResponseFilter is never being called.
>>>
>>> Why would that be?
>>>
>> Apparently it has something to do with the JSONCallbackResponseFilter
>> being a nested class. Once I made it a top level class all is well. I
>> am all set on the workaround. Thanks.
>>
>
> You are not using the correct fully qualified name for an inner class,
> it needs to be:
>
> xxx.SomeClass$JSONCallbackResponseFilter
>

Thank Paul for pointing out my mistake. The workaround is working now
but I have a different issue.

The use of '@' sign in resulting JSON as described by BadgerFish is
causing a downstream problem for me as the toolkit I am using to process
JSON does not like it. So I need to fix my ResponseFilter to remove '@'
sign in the JSON output.

Here is what my adapter class looks like:

    /**
     *
     * See:
http://n2.nabble.com/-Filter--how-to-customize-context-body---td2116754.html
     */
    private static final class JSONCallbackResponseAdapter implements
ContainerResponseWriter {

        private final ContainerResponseWriter crw;
        private OutputStream out;
        private String callback;

        JSONCallbackResponseAdapter(ContainerResponseWriter crw, String
callback) {
            this.crw = crw;
            this.callback = callback;
        }

        public OutputStream writeStatusAndHeaders(long contentLength,
ContainerResponse response) throws IOException {
            out = crw.writeStatusAndHeaders(-1, response);

            out.write((this.callback + "(").getBytes());
            return out;
        }

        public void finish() throws IOException {
            out.write(")".getBytes());
        }
    }

I do not quite understand the above code originally from you. Where does
the main body of the response get injected taht I need to filter?

What would I need to change to remove '@' sign globally from the response?

Thanks for your help.

-- 
Regards,
Farrukh
Web: http://www.wellfleetsoftware.com