2017-03-27 85 views
0

我正在研究Oracle ADF和EJB。我使用ADF作爲View和Controller,EJB作爲服務。我不想使用ADF模型來綁定EJB Session以與ADF面交互。所以,我已創建一個託管bean與ADF互動面臨如何將EJB會話注入ADF ManagedBean

ManagedBean

public class EmployeeManagementController { 
    private List<Jobs> jobList; 
    private RichTable jobTable; 
    private RichPanelGroupLayout panelGroup; 

    //@EJB(mappedName = "HRSysDemo.JobBean",name = "jobBean") 
    @EJB 
    private JobBeanLocal jobBean; 
    /*...*/ 

    public void initPage() { 
     System.out.println("TESTING . . ."); 
     jobList = jobBean.getJobsFindAll(); 
    } 
} 

會話Bean

@Stateless(mappedName = "HRSysDemo/JobBean") 
public class JobBean implements JobBeanRemote, JobBeanLocal { 
    @Resource 
    SessionContext sessionContext; 
    @PersistenceContext(unitName = "Model") 
    private EntityManager em; 
    /*...*/ 
    public List<Jobs> getJobsFindAll() { 
     return em.createNamedQuery("Jobs.findAll").getResultList(); 
    } 
} 

我的問題是 「jobBean」 總是 「空」,這意味着EJB Session不能注入到ManagedBean。我嘗試了一些方法,例如更改接口注入(Remote interface),指定名稱和mappedName,但它仍然不起作用。那麼,如何將EJB SessionBean注入到ADF ManagedBean中?

提前致謝!

+0

請問這兩種模式在EAR和WAR模塊權登記的EJB模塊? –

+1

我不確定。我不使用Eclipse,我使用Jdeveloper:/ –

+0

它不是IDE特定的文件格式。它是一個打包的J2EE應用程序格式(可以部署)。 –

回答

0

我已經通過在here中的某個步驟完成了,它運行不正常,但我修復了它們。我希望這將是對別人有所幫助:

這裏我的代碼:

ELResolverWithInjectEJB.java

import java.lang.reflect.AccessibleObject; 
import java.lang.reflect.Field; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

import java.util.Hashtable; 
import java.util.List; 
import java.util.Map; 

import com.google.common.collect.Maps; 
import com.google.common.collect.Lists; 

import java.util.concurrent.ConcurrentHashMap; 
import javax.el.ELContext; 
import javax.el.MapELResolver; 

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

import oracle.adf.controller.metadata.model.beans.ManagedBean; 
import oracle.adf.controller.metadata.model.beans.ManagedBeanScopeType; 

/* Illegal internal package import. Please use public API */ 
import oracle.adfinternal.controller.beans.AnnotationUtils; 
import oracle.adfinternal.controller.beans.ManagedBeanFactory; 
import oracle.adfinternal.controller.state.ScopeMap; 

public class ELResolverWithInjectEJB extends MapELResolver { 
    private static Method getManagedBeanScopeType = null; 
    private static Method shouldIncludeHigherScopes = null; 
    private static Method newInstance = null; 
    static { 
     try { 
      getManagedBeanScopeType = ScopeMap.class.getDeclaredMethod("getManagedBeanScopeType", null); 
      getManagedBeanScopeType.setAccessible(true); 
      shouldIncludeHigherScopes = ScopeMap.class.getDeclaredMethod("shouldIncludeHigherScopes", null); 
      shouldIncludeHigherScopes.setAccessible(true); 
      newInstance = ManagedBeanFactory.class.getDeclaredMethod("newInstance", ManagedBean.class); 
      newInstance.setAccessible(true); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public ELResolverWithInjectEJB() { 
     super(); 
    } 

    @SuppressWarnings("oracle.jdeveloper.java.semantic-warning") 
    public Object getValue(ELContext elContext, Object base, Object var) { 
     ScopeMap scope = (ScopeMap) (base instanceof ScopeMap ? base : null); 
     if (scope == null || scope.containsKey(var)) 
      return super.getValue(elContext, base, var); 
     Object bean = null; 
     try { 
      ManagedBeanFactory mbf = ManagedBeanFactory.getInstance(); 
      ManagedBean managedBean = mbf.getManagedBeanInCurrentPageFlow((String) var); 
      ManagedBeanScopeType expectedScope = (ManagedBeanScopeType) getManagedBeanScopeType.invoke(scope, null); 
      if (((Boolean) shouldIncludeHigherScopes.invoke(scope, null)) && 
       (managedBean == null || !managedBean.getScope().equals(expectedScope))) { 
       managedBean = mbf.getManagedBeanInAdfPageFlow((String) var); 
       } 
      if (managedBean != null && managedBean.getScope().equals(expectedScope)) { 
       bean = newInstance.invoke(mbf, managedBean); 
       if (bean != null) { 
        scope.put((String) var, bean); 
        EJBInjector.inject(bean); 
        AnnotationUtils.runPostConstructIfSpecified(bean, managedBean.getName(), managedBean.getScope()); 
        elContext.setPropertyResolved(true); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return bean; 
    } 

    static class EJBInjector { 
     private static Map<String, List> processed = Maps.newConcurrentMap(); 
     private static Map<String, String> mappedBean = Maps.newConcurrentMap(); 
     private static Context ctx = null; 
     static { 
      try { 
       ctx = getInitialContext(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     @SuppressWarnings("unchecked") 
     public static void inject(Object o) throws IllegalAccessException, InvocationTargetException, NamingException { 
      List<AccessibleObject> inj = null; 
      if (!processed.containsKey(o.getClass().getName())) { 
       inj = Lists.newArrayList(); 
       for (Field field : o.getClass().getDeclaredFields()) { 
        if (field.getAnnotation(Autoinjector.class) != null) { 
         field.setAccessible(true); 
         inj.add(field); 
         Autoinjector rm = field.getAnnotation(Autoinjector.class); 
         mappedBean.put(convertKey(o, field), rm.ejbMappedName()); 
        } 
       } 
       processed.put(o.getClass().getName(), inj.isEmpty() ? null : inj); 
      } 
      inj = inj != null ? inj : processed.get(o.getClass().getName()); 
      if (inj != null) { 
       for (AccessibleObject i : inj) { 
        ((Field) i).set(o,ctx.lookup(mappedBean.get(convertKey(o, (Field) i)) + "#" + 
                ((Field) i).getType().getName())); 
       } 
      } 
     } 

     private static String convertKey(Object o, Field f) { 
      return o != null && f != null ? o.getClass().getName() + "_" + f.getType().getName() + "_" + f.getName() : 
         ""; 
     } 

     @SuppressWarnings("unchecked") 
     public static Context getInitialContext() throws NamingException { 
      Hashtable env = new Hashtable(); 
      env.put(Context.INITIAL_CONTEXT_FACTORY,[your_provide]); 
      env.put(Context.PROVIDER_URL, [your_url_server]); 
      return new InitialContext(env); 
      } 
     } 
    } 

Autoinjector.java

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Autoinjector { 
    String ejbMappedName() default ""; 
} 

面孔,配置.xml

<application> 
    <default-render-kit-id>oracle.adf.rich</default-render-kit-id> 
    <el-resolver>[your_package].ELResolverWithInjectEJB</el-resolver> 
</application> 

在控制器

public class DicOrgDetailPageController extends BaseController { 

    private static final long serialVersionUID = 2332665929048532518L; 

    /* -- Services -- */ 
    @Autoinjector(ejbMappedName = "mytest") 
    private SB_DicOrgService sbDicOrgService; 
} 
0

您是在adfc-config中定義bean嗎?如果它可能不起作用 - 請嘗試在普通的faces-config文件中定義它們。

+0

我沒有在adfc-config文件中定義它們:(。我在faces-config中定義了它們。 –