java.lang.RuntimeException:RESTEASY003325:无法构造公共

时间:2018-11-16 07:02:07

标签: java wildfly jndi

尝试时出现以下异常

ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 542) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./rest: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./rest: java.lang.RuntimeException: RESTEASY003325: Failed to construct public com.us.demo.rs.RestApplicationMapper()
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:81) [wildfly-undertow-12.0.0.Final.jar:12.0.0.Final]
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [java.base:]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [java.base:]
    at org.jboss.threads@2.3.1.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) [jboss-threads-2.3.1.Final.jar:2.3.1.Final]
    at org.jboss.threads@2.3.1.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985) [jboss-threads-2.3.1.Final.jar:2.3.1.Final]
    at org.jboss.threads@2.3.1.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487) [jboss-threads-2.3.1.Final.jar:2.3.1.Final]
    at org.jboss.threads@2.3.1.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378) [jboss-threads-2.3.1.Final.jar:2.3.1.Final]
    at java.base/java.lang.Thread.run(Thread.java:834) [java.base:]
    at org.jboss.threads@2.3.1.Final//org.jboss.threads.JBossThread.run(JBossThread.java:485) [jboss-threads-2.3.1.Final.jar:2.3.1.Final]
Caused by: java.lang.RuntimeException: RESTEASY003325: Failed to construct public com.us.demo.rs.RestApplicationMapper()
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:162)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.spi.ResteasyProviderFactory.injectedInstance(ResteasyProviderFactory.java:2702)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.interception.JaxrsInterceptorRegistry$AbstractInterceptorFactory.createInterceptor(JaxrsInterceptorRegistry.java:170)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.interception.JaxrsInterceptorRegistry$OnDemandInterceptorFactory.initialize(JaxrsInterceptorRegistry.java:188)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.interception.JaxrsInterceptorRegistry$OnDemandInterceptorFactory.checkInitialize(JaxrsInterceptorRegistry.java:203)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.interception.JaxrsInterceptorRegistry$OnDemandInterceptorFactory.getInterceptor(JaxrsInterceptorRegistry.java:214)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.interception.JaxrsInterceptorRegistry$AbstractInterceptorFactory.postMatch(JaxrsInterceptorRegistry.java:151)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.interception.JaxrsInterceptorRegistry.postMatch(JaxrsInterceptorRegistry.java:421)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.interception.ContainerRequestFilterRegistry.postMatch(ContainerRequestFilterRegistry.java:57)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.ResourceMethodInvoker.<init>(ResourceMethodInvoker.java:115)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.ResourceMethodRegistry.processMethod(ResourceMethodRegistry.java:345)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.ResourceMethodRegistry.register(ResourceMethodRegistry.java:272)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:223)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:195)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:181)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:158)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.core.ResourceMethodRegistry.addPerRequestResource(ResourceMethodRegistry.java:77)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.processApplication(ServletContainerDispatcher.java:178)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:104)
    at org.jboss.resteasy.resteasy-jaxrs//org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:36)
    at io.undertow.servlet//io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117) [undertow-servlet-2.0.0.Final.jar:2.0.0.Final]
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:78) [wildfly-undertow-12.0.0.Final.jar:12.0.0.Final]
    at io.undertow.servlet//io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:103) [undertow-servlet-2.0.0.Final.jar:2.0.0.Final]
    at io.undertow.servlet//io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:300) [undertow-servlet-2.0.0.Final.jar:2.0.0.Final]
    at io.undertow.servlet//io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:140) [undertow-servlet-2.0.0.Final.jar:2.0.0.Final]
    at io.undertow.servlet//io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:579) [undertow-servlet-2.0.0.Final.jar:2.0.0.Final]
    at io.undertow.servlet//io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:550) [undertow-servlet-2.0.0.Final.jar:2.0.0.Final]
    at io.undertow.servlet//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42) [undertow-servlet-2.0.0.Final.jar:2.0.0.Final]
    at io.undertow.servlet//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) [undertow-servlet-2.0.0.Final.jar:2.0.0.Final]
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105) [wildfly-undertow-12.0.0.Final.jar:12.0.0.Final]
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526) [wildfly-undertow-12.0.0.Final.jar:12.0.0.Final]
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526) [wildfly-undertow-12.0.0.Final.jar:12.0.0.Final]
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526) [wildfly-undertow-12.0.0.Final.jar:12.0.0.Final]
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526) [wildfly-undertow-12.0.0.Final.jar:12.0.0.Final]
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526) [wildfly-undertow-12.0.0.Final.jar:12.0.0.Final]
    at io.undertow.servlet//io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:592) [undertow-servlet-2.0.0.Final.jar:2.0.0.Final]
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:97) [wildfly-undertow-12.0.0.Final.jar:12.0.0.Final]
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:78) [wildfly-undertow-12.0.0.Final.jar:12.0.0.Final]
    ... 8 more

原因:WfaException {消息:未找到与com.netapp.wfa.rs.RestApplicationMapper类的字段'restApiLogger'匹配的EJB,原因:null}     在部署时.wfa-0.5.ear.common-0.5.jar // com.netapp.wfa.common.SessionUtil.injectDependencies(SessionUtil.java:128)     在部署时.wfa-0.5.ear.common-0.5.jar // com.netapp.wfa.common.SessionUtil.injectDependencies(SessionUtil.java:70)     在部署时.wfa-0.5.ear.common-0.5.jar // com.netapp.wfa.common.SessionUtil.injectDependencies(SessionUtil.java:66)     在部署时.wfa-0.5.ear.rest-facade-0.5.war // com.netapp.wfa.rs.RestApplicationMapper。(RestApplicationMapper.java:21)     在java.base / jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)[java.base:]     在java.base / jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)[java.base:]     在java.base / jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)[java.base:]     在java.base / java.lang.reflect.Constructor.newInstance(Constructor.java:490)[java.base:]     在org.jboss.resteasy.resteasy-jaxrs // org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:150)     ...另外45个

引起异常的代码

public class SessionUtil {
    public static final String CONTEXT_NAME = "java:global/" + EarUtils.getEarName();
    private List<Object> deployedEjbList; //Note: this is lazy initialized
    private Map<Class, Object> deployedEjbByInterface; //Note: this is (very) lazy initialized

    private static SessionUtil instance = new SessionUtil();

    public static <P> P injectDependencies(P pojo) {
        return injectDependencies(pojo, null);
    }

    public static <P> P injectDependencies(P pojo, EntityManager entityManager) {
        return instance.injectDependencies(pojo, entityManager, null, null);
    }

    protected <P> P injectDependencies(P pojo, EntityManager entityManager, SessionContext sessionContext, UserTransaction userTransaction) {
        if (pojo == null) return null;

        // Loop over the class hierarchy of the pojo
        for (Class clazz = pojo.getClass(); !clazz.equals(Object.class); clazz = clazz.getSuperclass()) {

            // For each class, iterate over its field and look for EJB annotations
            for (Field field : clazz.getDeclaredFields()) {

                // Lookup and inject to @EJB annotated member variables
                if (field.isAnnotationPresent(EJB.class)) {

                    // Get field class and make sure the field is an interface
                    Class<?> fieldClass = getFieldInterface(clazz, field);

                    // Get the EJB to be assigned to this field
                    Object ejb = getEjbForField(fieldClass);
                    if (ejb == null) {
                        throw new WfaException("No EJB was found matching field '" + field.getName() + "' of class " + clazz);
                    }

                    // Assign the EJB to the field
                    assignEjbToField(pojo, clazz, field, ejb);
                }

                // Inject an entityManager to @PersistenceContext annotated member variables
                else if (field.isAnnotationPresent(PersistenceContext.class)) {

                    // Get field class and make sure the field is an interface
                    Class<?> fieldClass = getFieldInterface(clazz, field);

                    if (!EntityManager.class.equals(fieldClass)) {
                        throw new WfaException("Field '" + field.getName() + "' of class " + clazz + " is annotated with PersistenceContext but isn't EntityManager");
                    }

                    // Assign the EntityManager to the field
                    assignEjbToField(pojo, clazz, field, entityManager);
                }

                // Inject a data-source to @Resource annotated member variables with the appropriate class
                else if (field.isAnnotationPresent(Resource.class)) {

                    // Get field class and make sure the field is an interface
                    Class<?> fieldClass = getFieldInterface(clazz, field);

                    // Assign the DataSource to the field
                    if (DataSource.class.equals(fieldClass)) {
                        String dataSourceName = field.getAnnotation(Resource.class).mappedName();
                        assignEjbToField(pojo, clazz, field, getDataSource(dataSourceName));
                    }

                    // Assign the SessionContext to the field
                    else if (SessionContext.class.equals(fieldClass)) {
                        assignEjbToField(pojo, clazz, field, sessionContext);
                    }
                    // Assign the SessionContext to the field
                    else if (UserTransaction.class.equals(fieldClass)) {
                        assignEjbToField(pojo, clazz, field, userTransaction);
                    }
                }
            }
        }

        return pojo;
    }

    public static Map<Class, Object> getDeployedEjbByInterface() {
        if (instance.deployedEjbByInterface == null || instance.deployedEjbByInterface.isEmpty()) {
            instance.initDeployedEjbByInterface();
        }

        return instance.deployedEjbByInterface;
    }

    protected synchronized List<Object> getDeployedEjbList() {
        if (deployedEjbList == null) {
            deployedEjbList = initDeployedEjbList();
        }

        return deployedEjbList;
    }

    private void initDeployedEjbByInterface() {
        // Crate a map from EJB interfaces to EJB instances.
        deployedEjbByInterface = new HashMap<>();
        for (Object ejb : getDeployedEjbList()) {
            for (Class anInterface : ejb.getClass().getInterfaces()) {

                // Register only interfaces annotated as "remote" or "local"
                if (anInterface.getAnnotation(Remote.class) != null || anInterface.getAnnotation(Local.class) != null) {
                    deployedEjbByInterface.put(anInterface, ejb);
                }
            }
        }
    }

    private List<Object> initDeployedEjbList() {
        InitialContext context = null;
        NamingEnumeration<NameClassPair> allWfaEjbNameAndClass = null;
        NamingEnumeration<NameClassPair> internalNamingEnumeration = null;
        try {
            /**
             * Enumerate the names bound in the named context
             */
            context = new InitialContext();

            allWfaEjbNameAndClass = context.list(CONTEXT_NAME);

            /**
             * Iterate the entries in the WFA EAR looking for EJBs with remote/local interfaces
             */
            deployedEjbList = new LinkedList<>();
            while (allWfaEjbNameAndClass.hasMore()) {
                NameClassPair jarNameAndClass = allWfaEjbNameAndClass.next();

                internalNamingEnumeration = context.list(CONTEXT_NAME + "/" + jarNameAndClass.getName());

                while (internalNamingEnumeration.hasMore()) {
                    NameClassPair ejbNameAndClass = internalNamingEnumeration.next();
                    // Skip EJB names with "!" in it as they are duplicate
                    if (ejbNameAndClass.getName().indexOf('!') >= 0) continue;

                    Object ejb = silentLookup(context, CONTEXT_NAME + "/" + jarNameAndClass.getName() + "/" + ejbNameAndClass.getName());
                    if (ejb != null) {
                        deployedEjbList.add(ejb);
                    }
                }
            }

            return deployedEjbList;

        } catch (NamingException e) {
            throw new WfaException("Failed to list EJBs in :" + CONTEXT_NAME, e);
        } finally {

            silentClose(allWfaEjbNameAndClass);
            silentClose(internalNamingEnumeration);
            silentClose(context);
        }
    }

    private Object silentLookup(Context context, String name) {
        try {

            return context.lookup(name);

        } catch (NamingException e) {
            return null;
        }
    }

    private static void silentClose(NamingEnumeration<NameClassPair> namingEnumeration) {
        if (namingEnumeration != null) {
            try {
                namingEnumeration.close();
            } catch (NamingException e) {
                LOGGER.error("Failed to close NamingEnumeration", e);
            }
        }
    }

    protected Object getEjbForField(Class<?> fieldClass) {
        Object obj = getDeployedEjbByInterface().get(fieldClass);

        // If no EJB was found, flush the cache and try again before giving up
        if (obj == null) {
            reset();
            obj = getDeployedEjbByInterface().get(fieldClass);
        }

        return obj;
    }

    public static synchronized void reset() {
        instance.deployedEjbList = null;
        instance.deployedEjbByInterface = null;
    }

    private Class<?> getFieldInterface(Class clazz, Field field) {
        Class<?> fieldClass = field.getType();
        if (!fieldClass.isInterface()) {
            throw new WfaException("Field '" + field.getName() + "' of class " + clazz + " isn't an interface");
        }
        return fieldClass;
    }

    private <P> void assignEjbToField(P pojo, Class clazz, Field field, Object ejb) {
        boolean fieldAccessible = field.isAccessible();
        field.setAccessible(true);
        try {
            field.set(pojo, ejb);
        } catch (Exception e) {
            throw new WfaException("Failed to inject EJB to member '" + field.getName() + "' of class: " + clazz, e);
        } finally {
            field.setAccessible(fieldAccessible);
        }
    }
}

我的应用程序在Wildfly 12和Java 8上运行。现在,我想升级到Java 11,然后遇到了这个问题。谁能帮助我解决这个问题?

0 个答案:

没有答案