0

I have many machines, identical. All are running Tomcat 8.5.31 and java 1.8.0_171-b11

I have a database class that creates an entity manager. I call the class from CDI on all machines, which works.

The method calls createEntityManagerFactory("jdbc/mydatabase")

I then call the same method using a listener defined in the web.xml and again it works, but only on some machines, the exact same .war

The only difference I can find is, the machines that it doesn't work on run Bitdefender?

On the machines that it doesn't work, I get the following null pointer,

java.lang.NullPointerException
    at javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver.getProviderNames(PersistenceProviderResolverHolder.java:197)
    at javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver.getPersistenceProviders(PersistenceProviderResolverHolder.java:112)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:76)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at com.tillsystem.managers.DatabaseManager.getEntityManageriTill(DatabaseManager.java:55)
    at com.tillsystem.managers.DatabaseManager.getTableTransactionsIds(DatabaseManager.java:245)
    at com.tillsystem.sync.SyncService.downloadTransactions(SyncService.java:249)
    at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
    at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Nazim Kerimbekov
  • 4,712
  • 8
  • 34
  • 58
Stuart Brand
  • 117
  • 8
  • Have you ever tried to unistall bitdefender to check if that is the real root problem? – Carlitos Way Jun 18 '18 at 03:02
  • Change log level to `trace` or `debug` for more information, as this is probably machine specific issue, not a code, so exception is not so informative. – hradecek Jun 18 '18 at 05:38
  • I've removed Bitdefender, same problem... Can Group policy effect PersistenceProviderResolverHolder? – Stuart Brand Jun 18 '18 at 09:09

1 Answers1

1

I fixed this by manually creating the PersistenceProviderResolver in the constructor of the class

PersistenceProviderResolverHolder.setPersistenceProviderResolver(new PersistenceProviderResolver() {
        private List<PersistenceProvider> providers = new ArrayList<PersistenceProvider>();

        @Override
        public List<PersistenceProvider> getPersistenceProviders() {
            org.eclipse.persistence.jpa.PersistenceProvider provider = new org.eclipse.persistence.jpa.PersistenceProvider();
            providers.add(provider);
            return providers;
        }

        @Override
        public void clearCachedProviders() {
            providers.clear();
        }
    });
    properties.put(PersistenceUnitProperties.CLASSLOADER, getClass()
            .getClassLoader());
Stuart Brand
  • 117
  • 8
  • You should be careful because every time you call PersistenceProviderResolverHolder.getPersistenceProviders(), in an implicit way, one provider is added to the list, to correct that one simply solution is validate that provider isn't in providers List, or do a different initialization like this. Add at your code: { org.eclipse.persistence.jpa.PersistenceProvider eclipseLinkProvider = new org.eclipse.persistence.jpa.PersistenceProvider(); providers.add(eclipseLinkProvider); } And remove providers.add(...) from getPersistentProviders() method. Hope this help. – Luis Carlos Oct 29 '19 at 14:49