Oppure

Loading
23/01/18 11:11
Sevenjeak
Salve,

Sto in questo periodo studiarmi il Java EE, ho iniziato con le pagine jsp ed ora sto passando agli ejb, ho creato con eclipse ee un progetto enterplace, collegato ad un progetto ejb, dove all'interno ho creato le seguente interfacce per un session bean stateless ( interfaccia locale, remota e un'interfaccia comune ad entrambi, contenuti nel package first.stateles ):

package first.stateless;

public interface OperationInterface {
	int sum(int... values);
	int divide(int... values);
	int subtract(int... values);
	int multiply(int... values);
}


package first.stateless;

import javax.ejb.Local;

@Local
public interface OperationLocal extends OperationInterface{

}


package first.stateless;

import javax.ejb.Remote;

@Remote
public interface OperationRemote extends OperationInterface {

}


Ed in fine ho creato il session bean ( sempre nello stesso package ):

package first.stateless;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

/**
 * Session Bean implementation class Operation
 */
@Stateless(mappedName = "Operation")
public class Operation implements OperationRemote, OperationLocal {

    /**
     * Default constructor. 
     */
    public Operation() {
        // TODO Auto-generated constructor stub
    }

	@Override
	@TransactionAttribute(TransactionAttributeType.NEVER)
	public int sum(int... values) {
		int result = 0;
		
		for (int i = 0; i < values.length; i++) {
			result += values[i];
		}
		
		return result;
	}

	@Override
	@TransactionAttribute(TransactionAttributeType.NEVER)
	public int divide(int... values) {
		int result = 0;
		
		for (int i = 0; i < values.length; i++) {
			result /= values[i];
		}
		
		return result;
	}

	@Override
	@TransactionAttribute(TransactionAttributeType.NEVER)
	public int subtract(int... values) {
		int result = 0;
		
		for (int i = 0; i < values.length; i++) {
			result -= values[i];
		}
		
		return result;
	}

	@Override
	@TransactionAttribute(TransactionAttributeType.NEVER)
	public int multiply(int... values) {
		int result = 0;
		
		for (int i = 0; i < values.length; i++) {
			result *= values[i];
		}
		
		return result;
	}

}


Come potete vedere anche da codice, i metodi della classe compiono semplici operazioni sui parametri passati.

Ora, provando a testarlo tramite una servlet in un progetto web ( ovviamente il progetto ejb è nel class-path del progetto ) richiamando l'interfaccia locale, mi funziona tutto correttamente, il problema è quando provo a testare l'interfaccia remota con JUnit5, tramite questa classe ( presente nel package test del progetto ejb ):

package test;

import static org.junit.jupiter.api.Assertions.*;

import java.util.Properties;

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

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import first.stateless.OperationRemote;
import junit.framework.TestCase;

class IntegrationTest {
	private static Context initialContext;
	private static OperationRemote remoteObject;
	
	@AfterAll
	public static void init() throws NamingException {
		Properties jndiProperties = new Properties();
		
		jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
		jndiProperties.put(Context.PROVIDER_URL, "http//localhost");
		initialContext = new InitialContext(jndiProperties);
	}
	
	@Test
	public void test() throws NamingException {
		remoteObject = (OperationRemote) initialContext.lookup("java:global/FirstEAR/FirstEJB/Operation!first.stateless.OperationRemote");
		
		TestCase.assertEquals(remoteObject.sum(10, 10), 20);
	}
	
	@BeforeAll
	public static void destroy() throws NamingException {
		/*initialContext.close();
		initialContext = null;*/
	}
}

Prima di eseguire, per evitare l'eccezione NoInitialContextFactory, mi sono scaricato da questo sito:

jar-download.com/

Il jar e tutte le dipendenze necessarie, inserendole tutte nel class-path del progetto.

Ho risolto l'eccezione NoInitialContextFactory, anche se, eseguendo il test mi fallisce, in fauler trace mi da le seguenti eccezioni:

java.lang.NullPointerException
	at test.IntegrationTest.test(IntegrationTest.java:33)
	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.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:389)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod(TestMethodTestDescriptor.java:167)
	at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:163)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute(HierarchicalTestExecutor.java:83)
	at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null(HierarchicalTestExecutor.java:92)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
	at java.util.stream.ReferencePipeline.accept(Unknown Source)
	at java.util.Iterator.forEachRemaining(Unknown Source)
	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
	at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
	at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.util.stream.ReferencePipeline.forEach(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute(HierarchicalTestExecutor.java:92)
	at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null(HierarchicalTestExecutor.java:92)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
	at java.util.stream.ReferencePipeline.accept(Unknown Source)
	at java.util.Iterator.forEachRemaining(Unknown Source)
	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
	at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
	at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.util.stream.ReferencePipeline.forEach(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute(HierarchicalTestExecutor.java:92)
	at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:51)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
	at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:82)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:539)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:761)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:461)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:207)


Ora, ho capito che il problema è nella prima riga del metodo test(), ma non di cosa si tratta, come potrei risolvere?


aaa
24/01/18 14:21
pierotofy
initialContext non e' initializzato.

Non conosco molto bene questo testing framework, ma ad occhio il problema e' qui:

@AfterAll
        public static void init() throws NamingException {
                Properties jndiProperties = new Properties();
               
                jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
                jndiProperties.put(Context.PROVIDER_URL, "http//localhost");
                initialContext = new InitialContext(jndiProperties);
        }


Invece che @AfterAll forse dovresti usare @Before?
Il mio blog: piero.dev
24/01/18 15:08
Sevenjeak
Ops.. Scusate, errore mio, per sbaglio ho invertito l'annotazione @AfterAll ( eseguita dopo i test ) con @BeforeAll ( eseguita prima dei test ).

Comunque ora non sono al pc, non potrei modificare il codice, ti faro sapere nel caso mi si presente un'altro errore, intando grazie per la risposta.

EDIT:

Ho corretto l'errore che avevo fatto invertendo l'annotazione @AfterAll con @BeforeAll, ho anche modificato il session bean, mi sono accordo di aver fatto degli errori di calcolo :d.

Purtroppo ora, JUnit, nella Failure list mi da questi errori:

javax.naming.NameNotFoundException: WFNAM00004: Name "global/FirstEAR/FirstEJB/Operation!first.stateless.OperationRemote" is not found
	at org.wildfly.naming.client.util.NamingUtils.lookupNative(NamingUtils.java:95)
	at org.wildfly.naming.client.AbstractContext.lookup(AbstractContext.java:84)
	at org.wildfly.naming.client.WildFlyRootContext.lookup(WildFlyRootContext.java:144)
	at javax.naming.InitialContext.lookup(Unknown Source)
	at test.IntegrationTest.test(IntegrationTest.java:33)
	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.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:389)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod(TestMethodTestDescriptor.java:167)
	at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:163)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute(HierarchicalTestExecutor.java:83)
	at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null(HierarchicalTestExecutor.java:92)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
	at java.util.stream.ReferencePipeline.accept(Unknown Source)
	at java.util.Iterator.forEachRemaining(Unknown Source)
	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
	at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
	at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.util.stream.ReferencePipeline.forEach(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute(HierarchicalTestExecutor.java:92)
	at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null(HierarchicalTestExecutor.java:92)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
	at java.util.stream.ReferencePipeline.accept(Unknown Source)
	at java.util.Iterator.forEachRemaining(Unknown Source)
	at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
	at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
	at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.util.stream.ReferencePipeline.forEach(Unknown Source)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute(HierarchicalTestExecutor.java:92)
	at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:51)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
	at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:82)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:539)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:761)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:461)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:207)


Da quello che ho capito non mi trova il riferimento jndi dell'interfaccia remota ( global/FirstEAR/FirstEJB/Operation!first.stateless.OperationRemote ), anche se mi sembra strano, anche perché quando avvio il server, sulla console mi stampa i riferimenti jndi del server ( riferimento che ho copiato da la ), come mai all'ora non mi trova l'interfaccia?
Ultima modifica effettuata da Sevenjeak 25/01/18 9:49
aaa
21/03/18 14:48
Bonny
Ciao,

riassumo in breve i passaggi da effettuare per la chiamata da un client (Main java).

1) Aggiunta di un utenza applicativa su wildfly di tipo B e che possa utilizzare gli Ejb (ultimo step rispondere yes).
Mediante la utility wildfly/bin/add-user.sh

Doc docs.jboss.org/author/display/WFLY8/…

2) Aggiungere in src (o alytra basta che venga inserita nel jar) un file chiamato jboss-ejb-client.properties, con il seguente contenuto:
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connections=default
remote.connection.default.host=127.0.0.1
remote.connection.default.port=8080
remote.connection.default.username=ejb
remote.connection.default.password=123


Dove ejb e 123 è il profilo utente aggiunto al punto 1).

Aggiungere il jar wildfly/bin/client/jboss-client.jar al class-path del progetto

Vedi screnn1.jpg per un esempio di progetto

3) Come fare il lookup
	static TestRemote lookup() throws NamingException {

		final Hashtable<Object, Object> jndiProperties = new Hashtable<Object, Object>();
		jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
		jndiProperties.put("jboss.naming.client.ejb.context", true);

		final String appName = "MyProjectEar"; //ear
		final String moduleName = "MyEjbs";     //ejb.jar
		final String distinctName = "";
		final String beanName = "Test";              //ejb name

		final String viewClassName = "com.test.TestRemote"; // interfaccia da usare
		System.out.println("Looking EJB via JNDI ");

                // NB start with --> ejb:
		final String jndi = String.format("ejb:%s/%s/%s/%s!%s", appName, moduleName, distinctName, beanName,
				viewClassName);

		System.out.println("jndi = " + jndi);

		return (TestRemote) new InitialContext(jndiProperties).lookup(jndi);

	}


Doc docs.jboss.org/author/display/WFLY8/…

Il link della doc riferiscono alla versione 8 di wildfly, vale anche per 9/10 per le successive devo verificare ma credo che sia rimasto così.

Buon divertimento :)
aaa