将Kotlin EJB注入Java POJO

时间:2018-08-06 18:56:23

标签: java kotlin cdi jboss-weld stateless-session-bean

刚刚开始尝试使用Kotlin(1.2.60)和Java(EE8)。使用Java EE 8,EJB 3.2将所有文件成功地在EAR文件中部署到JBoss WildFly 13.0.0.Final。日志中未显示任何异常。

我已经创建了Kotlin EJB:

@Stateless
@LocalBean
open class NOTiFYEJB {

    open val logger = LoggerFactory.getLogger("NOTiFYEJB")

    open fun sayHelloKotlinWorld() = {
        logger.info(">>>>> sayHelloKotlinWorld .....")
    }
}

哪些已在WildFly 13上“注册”:

  

08:06:26,131信息[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:00,459 INFO [com.notifywell.model.NOTiFYwellModel](默认   任务1)>>>> sayHelloKotlinWorld nOTiFYEJB =视图类的代理:   EJB的com.notifywell.kotlin.ejb.NOTiFYEJB:NOTiFYEJB

但是调用(已注入)Kotlin EJB中的方法的下一行未执行。

nOTiFYEJB.sayHelloKotlinWorld();

好像没有找到“本地”界面。

当我注入一个(本地)Java EJB时,这种“架构/设计”在其他地方都可以正常工作。

您是否可以使用Weld CDI将Kotlin EJB注入Java类中?

1 个答案:

答案 0 :(得分:0)

与带有Java EE 8的EJB 3.2不同,我需要在Kotlin EJB上创建和实现接口,而不仅仅是注释EJB。

我还需要'覆盖'并为我的void方法指定':Unit':

Kotlin EJB:

@Stateless
@LocalBean
open class NOTiFYKotlinEJB : NOTiFYKotlinEJBInterface {

    /**
     *
     */
    override fun sayHelloKotlinWorld(): Unit {
        println("***** sayHelloKotlinWorld .....")
    }
}

接口:

interface NOTiFYKotlinEJBInterface {

    fun sayHelloKotlinWorld() : Unit {}

}

我的@Model POJO调用Kotlin EJB方法并输出:

  

22:31:31,175 INFO [com.notifywell.model.NOTiFYwellModel](默认   任务1)>>>> sayHelloKotlinWorld nOTiFYEJB =视图类的代理:   EJB的com.notifywell.kotlin.ejb.NOTiFYKotlinEJB:NOTiFYKotlinEJB   22:31:31,191 INFO [stdout](默认任务1)***** sayHelloKotlinWorld   .....