将Kotlin EJB注入Java POJO
刚开始试用Kotlin(1.2.60)和Java(EE8)。所有这些都使用JavaEE8、EJB3.2在一个EAR文件中成功部署到JBossWildfly 13.0.0.Final上。日志中未显示任何异常 我已经创建了一个Kotlin EJB:将Kotlin EJB注入Java POJO,java,kotlin,cdi,jboss-weld,stateless-session-bean,Java,Kotlin,Cdi,Jboss Weld,Stateless Session Bean,刚开始试用Kotlin(1.2.60)和Java(EE8)。所有这些都使用JavaEE8、EJB3.2在一个EAR文件中成功部署到JBossWildfly 13.0.0.Final上。日志中未显示任何异常 我已经创建了一个Kotlin EJB: @Stateless @LocalBean open class NOTiFYEJB { open val logger = LoggerFactory.getLogger("NOTiFYEJB") open fun sayHello
@Stateless
@LocalBean
open class NOTiFYEJB {
open val logger = LoggerFactory.getLogger("NOTiFYEJB")
open fun sayHelloKotlinWorld() = {
logger.info(">>>>> sayHelloKotlinWorld .....")
}
}
@Stateless
@LocalBean
open class NOTiFYKotlinEJB : NOTiFYKotlinEJBInterface {
/**
*
*/
override fun sayHelloKotlinWorld(): Unit {
println("***** sayHelloKotlinWorld .....")
}
}
已在WildFly 13上“注册”:
08:06:26131信息[org.jboss.as.ejb3.deployment](MSC服务线程
1-1)WFLYEJB0473:中名为“NOTiFYEJB”的会话bean的JNDI绑定
部署单元的子部署“NOTiFYwellJAR.jar”
“NOTiFYwell.ear”如下所示:
java:global/NOTiFYwell/NOTiFYwellJAR/NOTiFYEJB!com.notifywell.kotlin.ejb.NOTiFYEJB
java:app/NOTiFYwellJAR/NOTiFYEJB!com.notifywell.kotlin.ejb.NOTiFYEJB
java:module/NOTiFYEJB!com.notifywell.kotlin.ejb.NOTiFYEJB
ejb:NOTiFYwell/NOTiFYwellJAR/NOTiFYEJB!com.notifywell.kotlin.ejb.NOTiFYEJB
java:global/NOTiFYwell/NOTiFYwellJAR/NOTiFYEJB
java:app/NOTiFYwellJAR/NOTiFYEJB java:module/NOTiFYEJB
我将其注入@model Java Pojo并调用该方法:
@Model
@Path("/")
public class NOTiFYwellModel {
@Inject
private NOTiFYEJB nOTiFYEJB;
public NOTiFYwellModel() {
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/say-hello-kotlin-world")
public Response sayHelloKotlinWorld() {
logger.info(">>>> sayHelloKotlinWorld nOTiFYEJB = {}", nOTiFYEJB);
nOTiFYEJB.sayHelloKotlinWorld();
return null; // Just for test
}
}
当我运行单元测试时:
String url = "http://localhost:8080/NOTiFYwell/notifywell/say-hello-kotlin-world";
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader(CONTENT_TYPE, APPLICATION_JSON);
// Execute and get the response.
HttpClient httpClient = HttpClientBuilder.create().build();
HttpResponse response = httpClient.execute(httpGet);
@Model NOTiFYwellModel类中的方法称为:
08:07:00459信息[com.notifywell.model.NOTiFYwellModel](默认值)
task-1)>>>>sayHelloKotlinWorld nOTiFYEJB=视图类的代理:
ejb的com.notifywell.kotlin.ejb.NOTiFYEJB:NOTiFYEJB
但是调用(注入的)Kotlin EJB中的方法的下一行不会执行
nOTiFYEJB.sayHelloKotlinWorld();
似乎找不到“本地”接口
当我注入一个(本地)JavaEJB时,这种“架构/设计”在其他任何地方都可以正常工作
您能够使用Weld CDI将Kotlin EJB@注入Java类吗?与带有Java EE 8的EJB3.2不同,我需要在我的Kotlin EJB上创建并实现一个接口,而不仅仅是注释EJB 我还需要为我的void方法“重写”&指定“:Unit”: Kotlin EJB:
@Stateless
@LocalBean
open class NOTiFYEJB {
open val logger = LoggerFactory.getLogger("NOTiFYEJB")
open fun sayHelloKotlinWorld() = {
logger.info(">>>>> sayHelloKotlinWorld .....")
}
}
@Stateless
@LocalBean
open class NOTiFYKotlinEJB : NOTiFYKotlinEJBInterface {
/**
*
*/
override fun sayHelloKotlinWorld(): Unit {
println("***** sayHelloKotlinWorld .....")
}
}
接口:
interface NOTiFYKotlinEJBInterface {
fun sayHelloKotlinWorld() : Unit {}
}
My@Model POJO调用Kotlin EJB方法并输出:
22:31:31175信息[com.notifywell.model.NOTiFYwellModel](默认值)
task-1)>>>>sayHelloKotlinWorld nOTiFYEJB=视图类的代理:
ejb的com.notifywell.kotlin.ejb.NOTiFYKotlinEJB:NOTiFYKotlinEJB
22:31:31191信息[stdout](默认任务-1)****sayHelloKotlinWorld
@duffymo:EJB3.2和轻量级纯web版本在很大程度上是201x(即使x接近9),都是标准化的,不需要spring,所以不需要所有spring-*包装器,就像EJB3.2在EE8上使用CDI的简单性和JBoss WildFly 13的速度一样。我确实觉得这相当讽刺(批评2010/2020年代的EJB),当时Spring不得不推出Spring Boot,因为太多人觉得Spring太复杂了。框架的框架。我知道它现在(终于)有了注释,但多年来它一直是XML配置的地狱!你说忽略这个方法是什么意思?根本没打电话或是爆炸?你调试过了吗?从EE PoV来看,这通常有效。另外,如果您正在运行一个真正的单元测试,您的EJB可能无法工作,因为没有活动的EJB容器。请参阅注释:@GET@products(MediaType.APPLICATION_JSON)@Path(“/say hello kotlin world”)。由于Kotlin EJB中的“记录器”未打印消息“>>>>>>sayHelloKotlinWorld…”,因此忽略/未调用它。没有“爆炸”。