Integrationsvejledning til forår og EJB

1. Oversigt

I denne artikel viser vi, hvordan du gør det integrer Spring og eksterne Enterprise Java Beans (EJB).

For at gøre dette opretter vi nogle EJB'er og de nødvendige eksterne grænseflader, og derefter kører vi dem inde i en JEE-container. Derefter starter vi vores Spring-applikation og ved hjælp af fjerngrænsefladerne instantierer vores bønner, så de kan udføre fjernopkald.

Hvis der er tvivl om, hvad EJB'er er, eller hvordan de fungerer, har vi allerede offentliggjort en indledende artikel om emnet her.

2. EJB-opsætning

Vi bliver nødt til at oprette vores eksterne grænseflader og vores EJB-implementeringer. For at gøre dem anvendelige har vi også brug for en beholder til at holde og administrere bønner.

2.1. EJB Remote Interfaces

Lad os starte med at definere to meget enkle bønner - en statsløs og en stateful.

Vi begynder med deres grænseflader:

@Remote offentlig grænseflade HelloStatefulWorld {int howManyTimes (); String getHelloWorld (); } 
@Remote offentlig grænseflade HelloStatelessWorld {String getHelloWorld (); }

2.2. EJB Implementering

Lad os nu implementere vores eksterne EJB-grænseflader:

@Stateful (name = "HelloStatefulWorld") offentlig klasse HelloStatefulWorldBean implementerer HelloStatefulWorld {private int howManyTimes = 0; public int howManyTimes () {returner howManyTimes; } offentlig streng getHelloWorld () {howManyTimes ++; returner "Hello Stateful World"; }} 
@Stateless (name = "HelloStatelessWorld") offentlig klasse HelloStatelessWorldBean implementerer HelloStatelessWorld {public String getHelloWorld () {return "Hello Stateless World!"; }} 

Hvis statefulde og statsløse bønner lyder ukendt, kan denne introduktionsartikel komme til nytte.

2.3. EJB Container

Vi kan køre vores kode i enhver JEE-container, men af ​​praktiske grunde bruger vi Wildfly og last Maven-plugin til at gøre det tunge for os:

 org.codehaus.cargo cargo-maven2-plugin 1.6.1 wildfly10x //download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final.zip 127.0.0.1 standalone-full 9990 test Bruger: admin1234! 

2.4. Kørsel af EJB'er

Med disse konfigureret kan vi køre containeren direkte fra Maven-kommandolinjen:

mvn ren pakkefragt: kør -Pwildfly-standalone

Vi har nu en fungerende forekomst af Wildfly, der er vært for vores bønner. Vi kan bekræfte dette ved hjælp af loglinjerne:

java: global / ejb-remote-for-spring / HelloStatefulWorld! com.baeldung.ejb.tutorial.HelloStatefulWorld java: app / ejb-remote-for-spring / HelloStatefulWorld! com.baeldung.ejb.tutorial.HelloStatefulWorld java: modul / HelloStatefulWorld! Com.baeldung.ejb.tutorial.HelloStatefulWorld java: jboss / exported / ejb-remote-for-spring / HelloStatefulWorld! Com.baeldung.ejb.tutorial.HelloStatefulWorld java: global / ejb-remote-for-spring / HelloStatefulWorld java : app / ejb-remote-for-spring / HelloStatefulWorld java: modul / HelloStatefulWorld 
java: global / ejb-remote-for-spring / HelloStatelessWorld! com.baeldung.ejb.tutorial.HelloStatelessWorld java: app / ejb-remote-for-spring / HelloStatelessWorld! com.baeldung.ejb.tutorial.HelloStatelessWorld java: modul / HelloStatelessWorld! Com.baeldung.ejb.tutorial.HelloStatelessWorld java: jboss / exported / ejb-remote-for-spring / HelloStatelessWorld! Com.baeldung.ejb.tutorial.HelloStatelessWorld java: global / ejb-remote-for-spring / HelloStatelessWorld java : app / ejb-remote-for-spring / HelloStatelessWorld java: modul / HelloStatelessWorld

3. Springopsætning

Nu hvor vores JEE-container er i gang, og vores EJB'er er implementeret, kan vi starte vores Spring-applikation. Vi bruger fjeder-boot-web for at gøre det lettere at teste manuelt, men det er ikke obligatorisk for fjernopkaldet.

3.1. Maven afhængigheder

For at kunne oprette forbindelse til eksterne EJB'er har vi brug for Wildfly EJB-klient bibliotek og vores eksterne grænseflade:

 org.wildfly wildfly-ejb-client-bom 10.1.0.Final pom com.baeldung.spring.ejb ejb-remote-for-spring 1.0.1 ejb 

Den sidste version af wildfly-ejb-klient-bom kan findes her.

3.2. Navngivning af strategisk kontekst

Med disse afhængigheder i klassestien kan vi instantier en javax.naming.Context at slå op på vores fjernbønner. Vi opretter dette som en Spring Bean, så vi kan autowire det, når vi har brug for det:

@Bean public Context context () kaster NamingException {Properties jndiProps = nye egenskaber (); jndiProps.put ("java.naming.factory.initial", "org.jboss.naming.remote.client.InitialContextFactory"); jndiProps.put ("jboss.naming.client.ejb.context", sandt); jndiProps.put ("java.naming.provider.url", "http-remoting: // localhost: 8080"); returner ny InitialContext (jndiProps); }

Egenskaberne er nødvendige for at informer både fjernbetjeningen URL og konteksten med navngivningsstrategien.

3.3. JNDI mønster

Før vi kan binde vores fjernbønner inde i Spring-beholderen, skal vi vide, hvordan vi når dem. Til dette bruger vi deres JNDI-bindinger. Lad os se standardmønsteret for disse bindinger:

$ {appName} / $ {moduleName} / $ {distinctName} / $ {beanName}! $ {viewClassName}

Husk, siden vi implementerede en simpel krukke i stedet for en øre og ikke eksplicit oprettet et navn, vi har ikke et appnavn og en tydeligt navn. Der er flere detaljer på vores EJB Intro-artikel, hvis noget virker underligt.

Vi bruger dette mønster til at binde vores fjernbønner til vores forår.

3.4. Opbygning af vores forårsbønner

For at nå vores EJB'er bruger vi den førnævnte JNDI. Husk loglinjer, som vi brugte til at kontrollere, om vores virksomhedsbønner blev implementeret?

Vi får vist disse oplysninger i brug nu:

@Bean offentlig HelloStatelessWorld helloStatelessWorld (kontekstkontekst) kaster NamingException {return (HelloStatelessWorld) context.lookup (this.getFullName (HelloStatelessWorld.class)); } 
@Bean offentlig HelloStatefulWorld helloStatefulWorld (kontekstkontekst) kaster NamingException {return (HelloStatefulWorld) context.lookup (this.getFullName (HelloStatefulWorld.class)); } 
private String getFullName (Class classType) {String moduleName = "ejb-remote-for-spring /"; String beanName = classType.getSimpleName (); Streng viewClassName = classType.getName (); return moduleName + beanName + "!" + viewClassName; }

Vi skal være meget forsigtige med den korrekte fulde JNDI-binding, ellers kan konteksten ikke nå den eksterne EJB og oprette den nødvendige underliggende infrastruktur.

Husk, at metoden kig op fra Sammenhæng vil kaste en Navngivelse af undtagelse hvis den ikke finder den bønne, du har brug for.

4. Integration

Med alt på plads kan vi indsprøjt vores bønner i en controller, så vi kan teste, om ledningerne er rigtige:

@RestController offentlig klasse HomeEndpoint {// ... @GetMapping ("/ stateless") offentlig String getStateless () {return helloStatelessWorld.getHelloWorld (); } @GetMapping ("/ stateful") offentlig String getStateful () {return helloStatefulWorld.getHelloWorld () + "kaldet" + helloStatefulWorld.howManyTimes () + "times"; }}

Lad os starte vores Spring-server og kontrollere nogle logfiler. Vi ser følgende linje, der indikerer, at alt er i orden:

EJBCLIENT000013: Vellykket versionshåndtryk afsluttet

Lad os nu teste vores statsløse bønne. Vi kan prøve nogle krølle kommandoer til at kontrollere, at de fungerer som forventet:

curl // localhost: 8081 / stateless Hello Stateless World!

Og lad os kontrollere vores statefulde:

krølle // localhost: 8081 / stateful Hello Stateful World kaldet 1 gange curl // localhost: 8081 / stateful Hello Stateful World kaldet 2 gange

5. Konklusion

I denne artikel lærte vi, hvordan vi integrerer Spring til EJB og foretager fjernopkald til JEE-containeren. Vi oprettede to eksterne EJB-grænseflader, og vi kunne kalde dem, der bruger Spring Beans på en gennemsigtig måde.

Selvom Spring er bredt vedtaget, er EJB'er stadig populære i virksomhedsmiljøer, og i dette hurtige eksempel har vi vist, at det er muligt at gøre brug af både de fordelte gevinster ved Jakarta EE og den lette brug af Spring-applikationer.

Som altid kan koden findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found