首页 > 解决方案 > 当我尝试在 wildfly 9.0.2 中注入 SessionContextImpl 时出现 NullPointerException

问题描述

我正在将一个jboss 5.1.0 GA 应用程序迁移到 Wildfly 9.0.2,我在其中管理 EJB,在一个无状态bean 中,EJBContext 以这种方式注入到 jboss 5 中并且它可以工作:

import javax.ejb.EJBContext;

@Stateless
@SecurityDomain (SystemSetting.SECURITY_DOMAIN)
@PermitAll
public class SystemServiceBean implements SystemServiceLocal {

@Resource
EjbContext ctx;

然后在这个方法中使用它

private Principal getCallerPrincipal () {
        try {         
            return SecurityUtil.getCallerPrincipal (ctx, (Subject) PolicyContext.getContext ("javax.security.auth.Subject.container"));
         PolicyContext.getContext ("javax.security.auth.Subject.container"));
        } catch (PolicyContextException e) {
            e.printStackTrace ();
        }
        return ctx.getCallerPrincipal ();
    }

后来尝试用这个方法返回main

public class SecurityUtil {
    public static Principal getCallerPrincipal (EJBContext ctx, Subject subject) {
        try {
            if (subject! = null) {
                Set <Group> subjectGroups = subject.getPrincipals (Group.class);
                Iterator <Group> iter = subjectGroups.iterator ();
                while (iter.hasNext ()) {
                    Group group = iter.next ();
                    String name = group.getName ();
                    if (name.equals ("CallerPrincipal")) {
                        Enumeration <? extends Home> members = group.members ();
                        if (members.hasMoreElements ()) {

                            Main principal = (Main) members.nextElement ();
                            return principal;

                        }
                    }
                }
            }

        } catch (Exception e) {
            System.out.println ("============================= catch:");
            Logger.getLogger (SecurityUtil.class.getName ()). Error (e);
        }
        return ctx.getCallerPrincipal ();
    }

但现在wildfly会引发以下错误:

**Caused by: javax.ejb.EJBException: java.lang.IllegalArgumentException: Can not set javax.ejb.EJBContext field net.ps.ais.system.ejb.SystemServiceBean.ctx to org.jboss.as.ejb3.context.SessionContextImpl
at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx (CMTTxInterceptor.java:187)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx (CMTTxInterceptor.java:277)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.requiresNew (CMTTxInterceptor.java:344)
at org.jboss.as.ejb3.tx.LifecycleCMTTxInterceptor.processInvocation (LifecycleCMTTxInterceptor.java:66)
at org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340)
at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation (CurrentInvocationContextInterceptor.java:41)
at org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340)
at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation (ConcurrentContextInterceptor.java:45)
at org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340)
at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation (ContextClassLoaderInterceptor.java:64)
at org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340)
at org.jboss.invocation.InterceptorContext.run (InterceptorContext.java:356)
at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation (PrivilegedWithCombinerInterceptor.java:80)
at org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:340)
at org.jboss.invocation.ChainedInterceptor.processInvocation (ChainedInterceptor.java:61)
at org.jboss.as.ee.component.BasicComponent.constructComponentInstance (BasicComponent.java:161)**

如果我将注入方式更改为:

import org.jboss.as.ejb3.context.SessionContextImpl;

    @Resource
    SessionContextImpl ctx;

抛出:

**Caused by: java.lang.NullPointerException
    at net.ps.ais.system.ejb.SystemServiceBean.helloWorld(SystemServiceBean.java:50)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:47)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:52)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(PooledInstanceInterceptor.java:51)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:254)**

有人可以帮助我吗?

标签: javajbossejb-3.0wildfly-9stateless-session-bean

解决方案


推荐阅读