Created
February 25, 2021 12:52
-
-
Save psamsotha/dca11de637b7d07a449cafeae9874e7b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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