如何正确部署 Bean - JNDI、Weblogic 12C

How Do I Correctly Deploy A Bean - JNDI, Weblogic 12C

我正在尝试为 weblogic 12C 服务器创建一个 bean。该 bean 将保存至少一个(可能更多)应用程序可以引用的几个值(具体来说 - 不记名令牌、令牌的持续时间以及检索时间)

我对此有点陌生(因此我感到困惑)

我正在运行安装最新版本的 Eclipse 并安装了 Weblogic 工具。我构建我的 bean 并将其部署到本地服务器。此时,我只是想获取我的上下文并查找我的 bean。当我 运行 客户端时,我得到这个:

java.lang.ClassCastException: weblogic.jndi.internal.WLContextImpl cannot be cast to com.salientcrgt.chums.oAuthToken
    at TestRemoteLoading.TestClass.getBean(TestClass.java:46)
    at TestRemoteLoading.TestClass.main(TestClass.java:27)

如果我进入 Weblogic 控制台并查找我的部署,我会在 "Test" 选项卡中看到:

oAuthTokenBeanEAR oAuthTokenBeanEAR     
Classloader Analysis Tool   Classloader Analysis Tool on server AdminServer
oAuthToken 
oAuthToken      Test points for this EJB module.
oAuthToken  AdminServer No test point since this EJB's home does not have a JNDI name.

BEAN 项目:

ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd" version="3.2">
  <display-name>oAuthTokenBean </display-name>
  <ejb-client-jar>oAuthTokenBeanClient.jar</ejb-client-jar>
</ejb-jar>

weblogic-ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-ejb-jar xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-ejb-jar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd http://xmlns.oracle.com/weblogic/weblogic-ejb-jar http://xmlns.oracle.com/weblogic/weblogic-ejb-jar/1.7/weblogic-ejb-jar.xsd">
    <!--weblogic-version:12.2.1.3-->
    <wls:weblogic-enterprise-bean>
        <wls:ejb-name>oAuthToken</wls:ejb-name>
        <wls:stateless-session-descriptor></wls:stateless-session-descriptor>
        <wls:jndi-name>oAuthToken</wls:jndi-name>
        <wls:local-jndi-name>oAuthToken</wls:local-jndi-name>
        <wls:jndi-binding>
            <wls:class-name>com.salientcrgt.chums.oAuthToken</wls:class-name>
        </wls:jndi-binding>
    </wls:weblogic-enterprise-bean>
</wls:weblogic-ejb-jar>

oAuthToken.java

/**
 * Session Bean implementation class oAuthToken
 */
@Stateless(name = "oAuthToken", mappedName = "oAuthToken")
@Remote ({com.salientcrgt.chums.oAuthTokenOBJ.class})
public class oAuthToken implements oAuthTokenOBJ, Serializable {

    public oAuthToken() {
    }

    private static final long serialVersionUID = 1L;

    private String service = "default";
    private String bearerToken;
    private int duration;
    private Date timeStamp;
...

oAuthtokenOBJ.java

package com.salientcrgt.chums;

import java.util.Date;

public interface oAuthTokenOBJ {
    public String getService();
    public String getBearerToken();
    public int getDuration();
    public Date getTimeStamp();
    public boolean Expired();
}

豆耳项目

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-application xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/javaee_6.xsd http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.8/weblogic-application.xsd">
    <!--weblogic-version:12.2.1.3-->
    <wls:application-param>
        <wls:param-name>webapp.encoding.default</wls:param-name>
        <wls:param-value>UTF-8</wls:param-value>
    </wls:application-param>
</wls:weblogic-application>

客户端应用程序:

这是我试图获取 bean 的方法

   @SuppressWarnings("unchecked")
    private static Context getInitialContext() throws NamingException {
        @SuppressWarnings("rawtypes")
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        env.put(Context.PROVIDER_URL, "t3://127.0.0.1:7001");
        return new InitialContext(env);
    }

    public static void getBean() {
        try {
            final Context c = getInitialContext();
            /** print list of jndi names in context */
            NamingEnumeration<NameClassPair> list = c.list("");
            while (list.hasMore()) {
              System.out.println(list.next().getName());
            }
            // get the bean
            setTokenBean((oAuthToken) c.lookup("oAuthToken#com"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

我认为我在客户端中做的事情是正确的,但在某种程度上没有正确地 assembled/deployed bean。我希望这些信息足以说明我在这里搞砸了什么。

这产生了以下输出:

mejbmejb_jarMejb_EO
oAuthToken#com
oAuthTokenBeanEARoAuthTokenBean_jaroAuthToken_Home
jmx
javax
oAuthTokenBeanEARoAuthTokenBean_jaroAuthToken_oAuthTokenOBJ
weblogic
__WL_GlobalJavaApp
_WL_internal_0N2TL1pYAVfZYdsOf5bIz5NXR1UAnTtG7gYEw8eSpFDasIK4NdrDolV9ZtejElAL
ejb
java:global
eis
java.lang.ClassCastException: weblogic.jndi.internal.WLContextImpl cannot be cast to com.salientcrgt.chums.oAuthToken
    at TestRemoteLoading.TestClass.getBean(TestClass.java:46)
    at TestRemoteLoading.TestClass.main(TestClass.java:27)

整理好了。

以上代码大部分正确。这是我最终得到的结果:

    public static void getBean() {
        try {
            final Context c = getInitialContext();
            setTokenBean( (oAuthTokenOBJ) 
                   c.lookup("oAuthToken#com.salientcrgt.chums.oAuthTokenOBJ"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

oAuthTokenOBJ 是接口。

我在测试中进入了主线 class 并且这样做了:

    public static void main(String Arg[]) throws IOException  {
        getBean();
        String myService = tokenBean.getService();
        System.out.println(myService);
    }

它打印 "default",这是 bean 中该字段的初始值。 希望这对其他人有帮助。

(我不可能是唯一一个发现 Oracle 文档有点迟钝的人。)大声笑