刚刚开始尝试使用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类中?
答案 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 .....