Integrasjonsveiledning for vår og EJB

1. Oversikt

I denne artikkelen viser vi hvordan du gjør det integrer våren og eksterne Enterprise Java Beans (EJB).

For å gjøre dette oppretter vi noen EJB-er og nødvendige eksterne grensesnitt, og deretter kjører vi dem inne i en JEE-container. Etter det starter vi vårapplikasjonen, og ved hjelp av de eksterne grensesnittene, instanserer bønnene våre slik at de kan utføre eksterne samtaler.

Hvis det er tvil om hva EJB er eller hvordan de fungerer, har vi allerede publisert en innledende artikkel om emnet her.

2. EJB-oppsett

Vi må lage våre eksterne grensesnitt og EJB-implementeringer. For å gjøre dem brukbare, trenger vi også en beholder for å holde og administrere bønner.

2.1. EJB eksterne grensesnitt

La oss starte med å definere to veldig enkle bønner - en statsløs og en stateful.

Vi begynner med deres grensesnitt:

@Remote offentlig grensesnitt HelloStatefulWorld {int howManyTimes (); String getHelloWorld (); } 
@Remote offentlig grensesnitt HelloStatelessWorld {String getHelloWorld (); }

2.2. EJB Implementering

La oss nå implementere våre eksterne EJB-grensesnitt:

@Stateful (name = "HelloStatefulWorld") offentlig klasse HelloStatefulWorldBean implementerer HelloStatefulWorld {private int howManyTimes = 0; public int howManyTimes () {return 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 stateful og stateless bønner høres ukjent ut, kan denne intro artikkelen komme til nytte.

2.3. EJB Container

Vi kan kjøre koden vår i en hvilken som helst JEE-container, men for praktiske formål bruker vi Wildfly og last Maven-plugin for å gjøre tungt løft for oss:

 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 frittstående full 9990 test Bruker: admin1234! 

2.4. Kjører EJB-ene

Med disse konfigurert kan vi kjøre containeren direkte fra Maven-kommandolinjen:

mvn ren pakkelast: kjør -Pwildfly-frittstående

Vi har nå en fungerende forekomst av Wildfly som er vert for våre bønner. Vi kan bekrefte dette med logglinjene:

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: module / 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: module / 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: module / 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: module / HelloStatelessWorld

3. Våroppsett

Nå som JEE-containeren vår er i gang, og EJB-ene er distribuert, kan vi starte vår-applikasjonen. Vi bruker vår-boot-web for å gjøre det lettere å teste manuelt, men det er ikke obligatorisk for ekstern samtale.

3.1. Maven avhengigheter

For å kunne koble til eksterne EJB-er, trenger vi Wildfly EJB-klient biblioteket og vårt eksterne grensesnitt:

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

Den siste versjonen av wildfly-ejb-client-bom finner du her.

3.2. Navngivning av strategisk kontekst

Med disse avhengighetene i klassestien kan vi instantiere en javax.naming.Context å slå opp fjernbønnene våre. Vi lager dette som en vårbønne, slik at vi kan autoledre den når vi trenger det:

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

Eiendommene er nødvendige for å informer både fjernkontrollen URL og navnestrategikonteksten.

3.3. JNDI Mønster

Før vi kan koble fjernbønnene våre inn i vårbeholderen, må vi vite hvordan vi kan nå dem. For dette vil vi bruke deres JNDI-bindinger. La oss se standardmønsteret for disse bindingene:

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

Husk at, siden vi distribuerte en enkel krukke i stedet for en øre og ikke eksplisitt satt opp et navn, vi har ikke et appName og en tydelig navn. Det er flere detaljer på vår EJB Intro-artikkel i tilfelle noe virker rart.

Vi bruker dette mønsteret til å binde våre eksterne bønner til våren.

3.4. Å bygge vårbønner

For å nå våre EJB-er, bruker vi nevnte JNDI. Husker du logglinjer som vi brukte for å sjekke om bedriftens bønner ble distribuert?

Vi får se den informasjonen som er i bruk nå:

@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 /"; Streng beanName = classType.getSimpleName (); Streng viewClassName = classType.getName (); return moduleName + beanName + "!" + viewClassName; }

Vi må være veldig forsiktige med riktig full JNDI-binding, eller konteksten vil ikke være i stand til å nå ekstern EJB og opprette den nødvendige underliggende infrastrukturen.

Husk at metoden se opp fra Kontekst vil kaste en Navngi unntak i tilfelle den ikke finner bønnen du trenger.

4. Integrasjon

Med alt på plass kan vi injiser bønnene våre i en kontroller, slik at vi kan teste om ledningene er riktige:

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

La oss starte vår-server og sjekke noen logger. Vi ser følgende linje som indikerer at alt er OK:

EJBCLIENT000013: Vellykket versjon av håndtrykk fullført

La oss nå teste vår statsløse bønne. Vi kan prøve noen krølle kommandoer for å bekrefte at de fungerer som forventet:

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

Og la oss sjekke vår stateful:

krøll // localhost: 8081 / stateful Hello Stateful World ringt 1 ganger curl // localhost: 8081 / stateful Hello Stateful World ringt 2 ganger

5. Konklusjon

I denne artikkelen lærte vi hvordan vi kan integrere Spring til EJB og foreta eksterne samtaler til JEE-containeren. Vi opprettet to eksterne EJB-grensesnitt, og vi kunne kalle de som bruker Spring Beans på en gjennomsiktig måte.

Selv om våren er vidt adoptert, er EJB fortsatt populære i bedriftsmiljøer, og i dette raske eksemplet har vi vist at det er mulig å benytte seg av både fordelte gevinster i Jakarta EE og enkel bruk av vårapplikasjoner.

Som alltid kan koden bli funnet på GitHub.