Skip to content

Instantly share code, notes, and snippets.

@psamsotha
Created February 25, 2021 12:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save psamsotha/dca11de637b7d07a449cafeae9874e7b to your computer and use it in GitHub Desktop.
Save psamsotha/dca11de637b7d07a449cafeae9874e7b to your computer and use it in GitHub Desktop.
import java.io.IOException;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
import org.glassfish.jersey.InjectionManagerProvider;
import org.glassfish.jersey.internal.inject.AbstractBinder;
import org.glassfish.jersey.internal.inject.InjectionManager;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.test.DeploymentContext;
import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.test.ServletDeploymentContext;
import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory;
import org.glassfish.jersey.test.spi.TestContainerFactory;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Test for Stack Overflow question https://stackoverflow.com/q/66354154/2587435
* Below are all the required dependencies to run the test
*
* <dependency>
* <groupId>org.glassfish.jersey.test-framework.providers</groupId>
* <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
* <version>2.25.1</version>
* <scope>test</scope>
* </dependency>
* <dependency>
* <groupId>org.assertj</groupId>
* <artifactId>assertj-core</artifactId>
* <version>3.14.0</version>
* <scope>test</scope>
* </dependency>
*/
public class ServletRequestClientInjectTest extends JerseyTest {
/**
* Sets an HttpServletRequest attribute that will be retrieved later
*/
public static class AttributeFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest servletRequest = (HttpServletRequest) request;
servletRequest.setAttribute("test-attribute", "test-value");
chain.doFilter(servletRequest, response);
}
}
/**
* Configuration for servlet environment in JerseyTest
*/
@Override
public DeploymentContext configureDeployment() {
return ServletDeploymentContext.forServlet(new ServletContainer(configure()))
.addFilter(AttributeFilter.class, "AttributeFilter")
.build();
}
/**
* Configuration for servlet environment in JerseyTest
*/
@Override
public TestContainerFactory getTestContainerFactory() {
return new GrizzlyWebTestContainerFactory();
}
/**
* Configure Jersey application
*/
@Override
public ResourceConfig configure() {
return new ResourceConfig()
.register(TestResource.class)
.register(ClientFeature.class);
}
/**
* Client feature that creates complete client injectable
*/
public static class ClientFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
InjectionManager im = InjectionManagerProvider.getInjectionManager(context);
context.register(new ClientBinder(im));
return true;
}
/**
* Client binder for injection framework
*/
private static class ClientBinder extends AbstractBinder {
private final InjectionManager im;
private ClientBinder(InjectionManager im) {
this.im = im;
}
@Override
protected void configure() {
ClientFilter clientFilter = new ClientFilter();
im.inject(clientFilter);
Client client = ClientBuilder.newClient()
.register(clientFilter);
bind(client).to(Client.class).in(Singleton.class);
}
}
/**
* Client filter gets attribute from HttpServletRequest and sets it
* in client filter header.
*/
private static class ClientFilter implements ClientRequestFilter {
@Inject
private HttpServletRequest servletRequest;
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
String testAttr = (String) servletRequest.getAttribute("test-attribute");
requestContext.getHeaders().putSingle("Test-Header", testAttr);
}
}
}
@Path("test")
public static class TestResource {
@Inject
Client client;
/**
* Method test client is calling; will forward call to `getClientCall()`
*/
@GET
public String get() {
return client.target("http://localhost:9998/test/client")
.request()
.get(String.class);
}
/**
* Test method to get test-header from client call
*/
@GET
@Path("client")
public String getClientCall(@HeaderParam("Test-Header") String testHeader) {
return testHeader;
}
}
@Test
public void testIt() {
String res = target("test").request().get(String.class);
System.out.println(res);
assertThat(res).isEqualTo("test-value");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment