users@jersey.java.net

[Jersey] How can I inject MessageBodyWorkers into a ClientResponseFilter w/out any EE/Servlet framework in JerseyClient?

From: Gergely Nagy <fogetti_at_gmail.com>
Date: Thu, 10 Jul 2014 18:07:47 +0900

Can somebody confirm if the scenario below is possible or not?

I want to use the following filter in my standalone application (no servlet
or EE container or whatever).

package somepackage.client.response;

import java.io.IOException;

import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;

import org.glassfish.jersey.message.MessageBodyWorkers;
import org.jvnet.hk2.annotations.Service;
import org.slf4j.Logger;

@Service
public class ResponseFilter implements ClientResponseFilter {

    @Inject
    private MessageBodyWorkers workers;
    private final Logger logger;

    public ResponseFilter(Logger logger) {
        this.logger = logger;
    }

    @Override
    public void filter(ClientRequestContext requestContext,
ClientResponseContext responseContext)
            throws IOException {
        System.out.println(String.format("MessageBodyWorkers: [%s]",
workers));
        if (responseValid(responseContext)) {
            return;
        }
        logger.error("Error", new Object(), new Object(), new Object());
    }

    private boolean responseValid(ClientResponseContext responseContext) {
        if (responseContext.getStatus() == HttpServletResponse.SC_OK) {
            return true;
        }
        return false;
    }
}

Then my idea was to register this HK2 AbstractBinder class in my client:
package somepackage.client;

import org.glassfish.hk2.utilities.binding.AbstractBinder;

import somepackage.client.response.ResponseFilter;

public class SitemapBinder extends AbstractBinder {

    @Override
    protected void configure() {
        bind(ResponseFilter.class).to(ResponseFilter.class);
    }
}

I wanted to do something like this (client is a JerseyClient instance):
client.register(new SitemapBinder());

But after performing the above nothing happens. I mean
the MessageBodyWorkers reference is not getting injected however I try it.

What am I missing here? Is it even possible? Or is there a workaround to
make this work?

Any help is appreciated.

Kind regards,
Gergely Nagy