Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Kotlin EJB注入Java POJO_Java_Kotlin_Cdi_Jboss Weld_Stateless Session Bean - Fatal编程技术网

将Kotlin EJB注入Java POJO

将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

刚开始试用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 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…”,因此忽略/未调用它。没有“爆炸”。