Проблема с использованием класса @Default в модулях, работает только @Specializes - PullRequest
1 голос
/ 08 июля 2019

Есть проект maven с несколькими модулями. Есть один класс, который должен иметь такое же поведение для всех модулей, кроме одного:

@Default
public class DefaultClassLoader {
    ...

    public String whoAmI(){
        return "Default";
    }

    @Retry(maxRetries = Integer.MAX_VALUE, delayUnit = ChronoUnit.SECONDS, delay = 5, retryOn = WebApplicationException.class)
    @Asynchronous
    @AccessTimeout(value = Long.MAX_VALUE)
    public void load(String moduleName, AboveIt aboveIt) {
    ....    
    }

}

Один @ Specializes переопределенный класс по умолчанию:

@Specializes
public class SpecificClassLoader extends DefaultClassLoader {

    @Override
    public String whoAmI(){
        return "Specific";
    }

    @Retry(maxRetries = Integer.MAX_VALUE, delayUnit = ChronoUnit.SECONDS, delay = 5, retryOn = WebApplicationException.class)
    @Asynchronous
    @AccessTimeout(value = Long.MAX_VALUE)
    public void load(String moduleName, AboveIt aboveIt) {
    #This is working well
    #Using somethingToSet instance
    ...

    }
}

И, наконец, класс, который использует DefaultClassLoader :

@Singleton
@Startup
public class AboveIt {

    ...

    @Inject
    private DefaultClassLoader defaultClassLoader;

    @PostConstruct
    public void load() {
        System.out.println(defaultClassLoader.whoAmI());
        System.out.println(defaultClassLoader);
        defaultClassLoader.load(moduleName, this);
    }

    ...
}

Классы DefaultClassLoader и AboveIt хранятся в сборке модуля в .jar, который используется многими другими модулями, созданными для .war, которые развернуты сервером Payara. Класс SpecificClassLoader хранится в структуре каталогов этого конкретного модуля.

Вызов System.out.println (defaultClassLoader) in AboveIt Класс работает каждый раз, но вызов defaultClassLoader.load (moduleName, this) работает только с SpecificClassLoader.

Результат System.out.println (defaultClassLoader) в ServerLog Payara при развертывании одного конкретного модуля:

[path].SpecificClassLoader@3d6bf268

Результат System.out.println (defaultClassLoader) с развертыванием любого другого модуля:

[path].DefaultClassLoader$Proxy$_$$_WeldSubclass@2054826f

И, следовательно, исключение на следующей строке ( defaultClassLoader.load (moduleName, this) ):

Exception while loading the app : javax.ejb.CreateException: Initialization failed for Singleton AboveIt
javax.ejb.CreateException: Initialization failed for Singleton AboveIt
  at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:564)
  at com.sun.ejb.containers.AbstractSingletonContainer.access$000(AbstractSingletonContainer.java:78)
  at com.sun.ejb.containers.AbstractSingletonContainer$SingletonContextFactory.create(AbstractSingletonContainer.java:734)
  at com.sun.ejb.containers.AbstractSingletonContainer.instantiateSingletonInstance(AbstractSingletonContainer.java:438)
  at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:219)
  at org.glassfish.ejb.startup.SingletonLifeCycleManager.initializeSingleton(SingletonLifeCycleManager.java:180)
  at org.glassfish.ejb.startup.SingletonLifeCycleManager.doStartup(SingletonLifeCycleManager.java:158)
  at org.glassfish.ejb.startup.EjbApplication.start(EjbApplication.java:169)
  at org.glassfish.internal.data.EngineRef.start(EngineRef.java:123)
  at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:294)
  at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:357)
  at com.sun.enterprise.v3.server.ApplicationLifecycle.initialize(ApplicationLifecycle.java:535)
  at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:542)
  at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:557)
  at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:553)
  at java.security.AccessController.doPrivileged(Native Method)
  at javax.security.auth.Subject.doAs(Subject.java:360)
  at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:552)
  at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:583)
  at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:575)
  at java.security.AccessController.doPrivileged(Native Method)
  at javax.security.auth.Subject.doAs(Subject.java:360)
  at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:574)
  at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1483)
  at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:119)
  at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1865)
  at org.glassfish.deployment.autodeploy.AutoOperation.run(AutoOperation.java:149)
  at org.glassfish.deployment.autodeploy.AutoDeployer.deploy(AutoDeployer.java:532)
  at org.glassfish.deployment.autodeploy.AutoDeployer.deployAll(AutoDeployer.java:437)
  at org.glassfish.deployment.autodeploy.AutoDeployer.run(AutoDeployer.java:371)
  at org.glassfish.deployment.autodeploy.AutoDeployer.run(AutoDeployer.java:362)
  at org.glassfish.deployment.autodeploy.AutoDeployService$1.run(AutoDeployService.java:231)
  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
  at java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:308)
  at java.util.concurrent.FutureTask.runAndReset(FutureTask.java)
  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  at java.lang.Thread.run(Thread.java:748)
Caused by: org.eclipse.microprofile.faulttolerance.exceptions.FaultToleranceException: Retry failed
  at fish.payara.microprofile.faulttolerance.policy.FaultTolerancePolicy.processRetryStage(FaultTolerancePolicy.java:386)
  at fish.payara.microprofile.faulttolerance.policy.FaultTolerancePolicy.processFallbackStage(FaultTolerancePolicy.java:326)
  at fish.payara.microprofile.faulttolerance.policy.FaultTolerancePolicy.processAsynchronousStage(FaultTolerancePolicy.java:281)
  at fish.payara.microprofile.faulttolerance.policy.FaultTolerancePolicy.proceed(FaultTolerancePolicy.java:268)
  at fish.payara.microprofile.faulttolerance.cdi.FaultToleranceInterceptor.intercept(FaultToleranceInterceptor.java:79)
  at sun.reflect.GeneratedMethodAccessor814.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:73)
  at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
  at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
  at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
  at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
  at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
  at eu.inloop.mcore.common.DefaultClassLoader$Proxy$_$$_WeldSubclass.load(Unknown Source)
  at eu.inloop.mcore.common.AboveIt.load(AboveIt.java:46)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at com.sun.ejb.containers.interceptors.BeanCallbackInterceptor.intercept(InterceptorManager.java:1047)
  at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:72)
  at com.sun.ejb.containers.interceptors.CallbackInvocationContext.proceed(CallbackInvocationContext.java:206)
  at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
  at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.init(SystemInterceptorProxy.java:125)
  at sun.reflect.GeneratedMethodAccessor623.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at com.sun.ejb.containers.interceptors.CallbackInterceptor.intercept(InterceptorManager.java:998)
  at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:72)
  at com.sun.ejb.containers.interceptors.CallbackInvocationContext.proceed(CallbackInvocationContext.java:206)
  at org.jboss.weld.module.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:81)
  at org.jboss.weld.module.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52)
  at sun.reflect.GeneratedMethodAccessor621.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at com.sun.ejb.containers.interceptors.CallbackInterceptor.intercept(InterceptorManager.java:998)
  at com.sun.ejb.containers.interceptors.CallbackChainImpl.invokeNext(CallbackChainImpl.java:72)
  at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:417)
  at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:380)
  at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:2087)
  at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:555)
  ... 39 more
]]

Добавление @ Alternative , вместе с @ Specializes , и листинг в beans.xml не помогает. Мне известно о плохом введенном defaultClassLoader . Почему что-то есть с Proxy ? а что значит Proxy в Java EE? Как это исправить, чтобы он полностью работал?

...