I have a solution that solved my problem here, I tried the proposed solution and did not work here. In my solution, it is necessary to annotate each class using the @MyInjectable annotation.
1-Create annotation
@Retention(RUNTIME) @Target(ElementType.TYPE) public @interface MyInjectable { }
2-Create an implementation of AbstractBinder
public class MyApplicationBinder extends AbstractBinder { @Override protected void configure() { bindFactory(EMFFactory.class).to(EntityManagerFactory.class).in(Singleton.class); bindFactory(EMFactory.class).to(EntityManager.class).in(RequestScoped.class); bind(Environment.class).to(Environment.class); scanAndBind("com.yourpackage.here"); } private void scanAndBind(String packageName) { try { Class[] classes = getClasses(packageName); for (Class<?> klazz: classes) { MyInjectable annotation = klazz.getAnnotation(MyInjectable.class); if (annotation!= null) { bind(klazz).to(klazz); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private static Class[] getClasses(String packageName) throws ClassNotFoundException, IOException { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); assert classLoader != null; String path = packageName.replace('.', '/'); Enumeration<URL> resources = classLoader.getResources(path); List<File> dirs = new ArrayList<>(); while (resources.hasMoreElements()) { URL resource = resources.nextElement(); dirs.add(new File(resource.getFile())); } ArrayList<Class> classes = new ArrayList<Class>(); for (File directory : dirs) { classes.addAll(findClasses(directory, packageName)); } return classes.toArray(new Class[classes.size()]); } private static List<Class> findClasses(File directory, String packageName) throws ClassNotFoundException { List<Class> classes = new ArrayList<Class>(); if (!directory.exists()) { return classes; } File[] files = directory.listFiles(); for (File file : files) { if (file.isDirectory()) { assert !file.getName().contains("."); classes.addAll(findClasses(file, packageName + "." + file.getName())); } else if (file.getName().endsWith(".class")) { classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6))); } } return classes; } }
3-Create ResourceConfig
public class MyApplication extends ResourceConfig { @Inject public MyApplication(ServiceLocator locator) { ServiceLocatorUtilities.enableImmediateScope(locator); .... register(new MyApplicationBinder()); } }
4-configure correctly in web.xml
<servlet> <servlet-name>Jersey Web Application</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>br.com.solutiontrue.ws</param-value> </init-param> <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>your.package.name.MyApplication</param-value> </init-param> <init-param> <param-name>jersey.config.server.resource.validation.disable</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
source share