我将尝试解释一个简单的REST示例。 这个想法是建立一个基本的架构来开始使用Jersey。 当我开始使用某些框架时,通常会开发一个快速失败的测试环境,这就是我要做的。
下一个示例具有以下功能:
- 泽西岛2.5.1
- 依赖注入
- 用于测试的JUnit
类:
- 资源:它将参加HTTP调用。
- 服务:这是具有两个实现Impl1和Impl2的接口。
- ServiceProvider:它将在运行时为每个请求调用提供适当的Service实现。
- TestBinder:将绑定设置为Resource。
import static org.junit.Assert.assertEquals;import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.process.internal.RequestScoped;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;public class JerseyInjectionTest extends JerseyTest {private static final String EXPECTED_CONTENT = "any string :P";/*** Checks that the Resource uses Impl1.class*/@Testpublic void invokeImpl1(){invoke(Impl1.class);}/*** Checks that the Resource uses Impl2.class*/@Testpublic void invokeImpl2(){invoke(Impl2.class);}/*** Checks that Resource.anyContent has always the value of EXPECTED_CONTENT*/@Testpublic void checkContent(){Response response = target("example/content").request().get();assertEquals(EXPECTED_CONTENT, response.readEntity(String.class));}private <T extends Service> void invoke(Class<T> service){final String serviceName = service.getName();Response response = target("example/"+serviceName).request().get();assertEquals(service.getName(), response.readEntity(String.class));}/*** Register the Resource and TestBinder in the Application*/@Overrideprotected Application configure() {return new ResourceConfig() {{register(new TestBinder());register(Resource.class);}};}@Path("/example")public static class Resource {@InjectService service;@InjectString anyContent;/*** Returns the name of the Service's implementation*/@GET@Path("/{serviceClass}")public Response getDynamicInvokedService() {return Response.ok(service.getClass().getName()).build();}/*** Returns always the value of anyContent*/@GET@Path("/content")public Response getStaticContent() {return Response.ok(anyContent).build();}}/*** This class will help Resource to set the @Inject fields.*/public static class TestBinder extends AbstractBinder{@Overrideprotected void configure() {bindFactory(ServiceProvider.class).to(Service.class);bind(EXPECTED_CONTENT).to(String.class);}}/*** This class will instance a Services's implementation* per each time that the Resource is called.*/@RequestScopedpublic static class ServiceProvider implements Factory<Service> {private final String serviceName;public ServiceProvider(@PathParam("serviceClass") String serviceName) {this.serviceName = serviceName;}@Overridepublic void dispose(Service arg0) {}@Overridepublic Service provide() {try {return (Service) Class.forName(serviceName).newInstance();} catch (Exception e) {return null;}}}/*** Dummy services*/public static interface Service {}public static class Impl1 implements Service {}public static class Impl2 implements Service {}}
现在,我们可以轻松尝试新功能。
希望对您有所帮助。
参考:在TODOdev博客上与我们的JCG合作伙伴 Sergio Molina 一起使用JerseyTest(Jersey 2.5.1和DI) 。
翻译自: https://www.javacodegeeks.com/2014/01/playing-with-jerseytest-jersey-2-5-1-and-di.html