import com.google.inject.Binder; import com.google.inject.AbstractModule; import com.lightbend.lagom.internal.javadsl.BinderAccessor; import com.lightbend.lagom.internal.javadsl.server.JavadslServicesRouter; import com.lightbend.lagom.internal.javadsl.server.ResolvedServices; import com.lightbend.lagom.internal.javadsl.server.ResolvedServicesProvider; import com.lightbend.lagom.internal.javadsl.server.ServiceInfoProvider; import com.lightbend.lagom.internal.server.status.MetricsServiceImpl; import com.lightbend.lagom.javadsl.api.ServiceInfo; import com.lightbend.lagom.javadsl.server.LagomServiceRouter; import com.lightbend.lagom.javadsl.server.ServiceGuiceSupport; import com.lightbend.lagom.javadsl.server.status.MetricsService; import java.util.Arrays; public class ServiceTestModule extends AbstractModule implements ServiceGuiceSupport { @Override protected void configure() { bindServices( serviceBinding(EchoService.class, EchoServiceImpl.class) // , serviceBinding(HelloService.class, HelloServiceImpl.class) ); } // ------------------------------ /** * This is a copy of {@link com.lightbend.lagom.javadsl.server.ServiceGuiceSupport#bindServices(ServiceGuiceSupport.ServiceBinding[])} * that should survive deprecation. When removing the method from the superclass this should inherit the removed code. * * This method is used in docs/ so that many tests can share a single Guice module. */ @Override public void bindServices(ServiceBinding... serviceBindings) { Binder binder = BinderAccessor.binder(this); for (ServiceBinding binding : serviceBindings) { // First, bind the client implementation. A service should be able to be a client to itself. bindClient(binding.serviceInterface()); // Now, bind the server implementation to itself as an eager singleton. if (binding instanceof ClassServiceBinding) { binder.bind(((ClassServiceBinding) binding).serviceImplementation()).asEagerSingleton(); } else { Object service = ((InstanceServiceBinding) binding).service(); binder.bind((Class) service.getClass()).toInstance(service); } } ServiceBinding primaryServiceBinding = serviceBindings[0]; // Bind the service info for the first one passed in binder.bind(ServiceInfo.class).toProvider( new ServiceInfoProvider( primaryServiceBinding.serviceInterface(), Arrays .stream(serviceBindings) .map(ServiceBinding::serviceInterface) .toArray(Class[]::new) )); // Bind the metrics ServiceBinding metricsServiceBinding = serviceBinding(MetricsService.class, MetricsServiceImpl.class); binder.bind(((ClassServiceBinding) metricsServiceBinding).serviceImplementation()).asEagerSingleton(); ServiceBinding[] allServiceBindings = new ServiceBinding[serviceBindings.length + 1]; System.arraycopy(serviceBindings, 0, allServiceBindings, 0, serviceBindings.length); allServiceBindings[allServiceBindings.length - 1] = metricsServiceBinding; // Bind the resolved services binder.bind(ResolvedServices.class).toProvider(new ResolvedServicesProvider(allServiceBindings)); // And bind the router binder.bind(LagomServiceRouter.class).to(JavadslServicesRouter.class); } }