0

私は自分のマシンで eclipse juno と jboss AS 7.1 final を実行し、それを介して構成しました (eclipse juno)。私は単純なステートレス Bean とそのインターフェースを持っています (実際、本 Enterprise Java Beans 3.1 6th Edition の例とまったく同じです)。コードは次のとおりです。


package beans;

public class CalculatorBeanBase implements CalculatorCommonBusiness{

    public int add(int[] opers){

        int sum = 0;
        for(int c:opers){
            sum+=c;
        }
        return sum;
    }

}

package beans;

public interface CalculatorCommonBusiness {

    public int add(int[] opers);

}

package beans;

public interface CalculatorRemoteBusiness extends CalculatorCommonBusiness {}

package beans;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

@Stateless
@LocalBean
public class SimpleCalculatorBean extends CalculatorBeanBase {}

次の JUnit テストを実行しようとしていますが、残念ながら、この例では、「クラスパスに存在すると想定される標準の jndi.properties ファイルを使用する」などについて言及しています (これが私の最初の問題です。これが何を意味するのかわかりません。実際、いくつかの調査を行いましたが、それがどのように機能するかを完全に理解できず、混乱し、最終的には機能しないようです)。

package beans;

import javax.naming.Context;
import javax.naming.InitialContext;
import junit.framework.TestCase;
import org.junit.BeforeClass;
import org.junit.Test;

public class CalculatorIntegrationTestCase {

    private static Context namingContext;
    private static SimpleCalculatorBean cal;
    private static final String JNDI_NAME_CALC = "java:global/jndi.properties/SimpleCalculatorBean";

    @BeforeClass
    public static void obtainProxyReferences() throws Throwable {
        namingContext = new InitialContext();
        cal = (SimpleCalculatorBean)namingContext.lookup(JNDI_NAME_CALC);
    }

    private void assertAdditionSucceeds(SimpleCalculatorBean cal){
        final int[] oper = {2,3,4};
        final int expectedSum = 9;
        final int actualSum = cal.add(oper);

        TestCase.assertEquals("Assert Failed!!. The actual value is not the expected",expectedSum, actualSum);
    }

    @Test
    public void testAdditionUsingBusinessReference() throws Throwable {
        this.assertAdditionSucceeds(cal);
    }
}

そのjndiの方法を知る必要があります。プロパティファイルの動作と設定方法。(私はこの最後の問題について読んで、次の .txt ファイルを取得し、その拡張子を .jar に変更しました。それが正しいかどうかはわかりません):

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jpn://localhost:1099 
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

最後に、その .jar ファイルをクラスパスに入れました (正しく行ったかどうかはわかりません: プロジェクトを右クリックし、パスをビルドし、ライブラリを作成し、外部 jar を追加します)。

上記のすべてのことを行いましたが、次のことを続けています。

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
    at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
    at javax.naming.InitialContext.lookup(Unknown Source)
    at beans.CalculatorIntegrationTestCase.obtainProxyReferences(CalculatorIntegrationTestCase.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

もちろん、私はプロジェクトを公開しました(ただし、Eclipseを介して、プロジェクト>実行>サーバーで実行)。助けていただければ幸いです

4

2 に答える 2

0

AS7 にはリモート ejb/jndi の完全に新しい実装があり、これは jnp をもう使用できないことを意味します。

https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+client+using+JNDIをご覧ください

およびhttps://docs.jboss.org/author/display/AS71/Remote+EJB+invocations+via+JNDI+-+EJB+client+API+or+remote-naming+project

そこに、今すぐそれを行う方法の説明があります。

于 2012-12-16T22:58:25.647 に答える