Java 无法在单独的ear中调用@Remote接口

Java 无法在单独的ear中调用@Remote接口,java,maven,jakarta-ee,jboss,Java,Maven,Jakarta Ee,Jboss,这是一个真正的新手问题,但我希望能得到一些帮助。我已经研究了其他问题,但还没有找到解决办法。也许我忽略了一些简单的事情 我正在部署一个带有ejb模块的ear到jboss: ejbjar中有一个bean,MyBean是@Stateless ejbjar还依赖于api jar。在api jar中有一个单独的@Remote接口MyInterface 此api jar位于ejb的lib文件夹中。 MyBean实现了MyInterface。 我打开耳朵,一切正常。我正在将其部署到jboss eap 6

这是一个真正的新手问题,但我希望能得到一些帮助。我已经研究了其他问题,但还没有找到解决办法。也许我忽略了一些简单的事情

我正在部署一个带有ejb模块的ear到jboss:

  • ejbjar中有一个bean,MyBean是@Stateless

  • ejbjar还依赖于api jar。在api jar中有一个单独的@Remote接口MyInterface

此api jar位于ejb的lib文件夹中。 MyBean实现了MyInterface。 我打开耳朵,一切正常。我正在将其部署到jboss eap 6.3.0。因此,从理论上讲,这个bean应该可以用于其他耳朵&战争

然后:我还使用了一个简单的rest类来调用远程MyInterface。 (这个想法只是从war调用一个远程bean,该war与拥有该bean的ear分开部署)

当我部署war时,会出现以下错误:

WELD-001408[MyInterface]类型与 注入点[[field]@injectprivate处的限定符[@Default] com.test.rest.MessageRestService.myInterface]

其余课程如下:

package com.test.rest;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

import com.test.MyInterface;

@Path("/message")
public class MessageRestService {

    @Inject
    private MyInterface myInterface;

    @GET
    @Path("/{param}")
    public Response printMessage(@PathParam("param") String msg) {
        final String result = myInterface.generateText(msg);
        return Response.status(200).entity(result).build();
    }
}
我做错了什么?我在ear和ejb中的META-INF中都有beans.xml,它在src/main/webapp/WEB-INF/beans.xml中也处于战争状态

我还将bean discovery mode=“all”放在beans.xml中,但没有乐趣。 此外,bean MyBean(实现远程接口)有一个无参数构造函数

另外:我有带接口的api jar,以及战争中作为依赖项引入的ejb jar。但它仍然给出了这个“未满足的依赖项”错误

有什么想法吗

谢谢

更新:这是MyInterface类:

package com.test;

import javax.ejb.Local;

@Local
public interface MyInterface {

    public String generateText(String text);

}
还有MyBean:

package com.mycompany;

import javax.ejb.Stateless;
import com.test.MyInterface;

@Stateless
public class MyBean implements MyInterface {

    public MyBean(){

    }

    public String generateText(String text) {
        return "Hello there! " + text;
    }

}
绑定:

19:11:22,679 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named MyBean in deployment unit subdeployment "MavenEnterpriseApp-ejb.jar" of deployment "MavenEnterpriseApp-ear-1.0-SNAPSHOT.ear" are as follows:

    java:global/MavenEnterpriseApp-ear-1.0-SNAPSHOT/MavenEnterpriseApp-ejb/MyBean!com.test.MyInterface
    java:app/MavenEnterpriseApp-ejb/MyBean!com.test.MyInterface
    java:module/MyBean!com.test.MyInterface
    java:global/MavenEnterpriseApp-ear-1.0-SNAPSHOT/MavenEnterpriseApp-ejb/MyBean
    java:app/MavenEnterpriseApp-ejb/MyBean
    java:module/MyBean

如果改为使用@EJB注入会发生什么?是的,这是有效的。为什么我不能在这里使用@Inject?或者使用@EJB调用这样的bean是标准的吗?另外:我本来希望能够将接口与war捆绑在一起,而java将解析实现类。但是,当我试图删除对实现类的依赖关系,或者甚至将依赖关系设置为“提供”时,这两种方法都不起作用。容器应该创建一个代理存根,以便通过MyInterface调用被远程发送到EAR文件中部署的EJB。您的@EJB注释可能还需要一个“mappedName”参数,该参数包含JBoss在部署MyBean时分配给您的全局名称之一。这些名称通常列在控制台日志中。我真的希望
mappedName
能起作用。您还可以尝试
lookup=“java:global/MavenEnterpriseApp-ear-1.0-SNAPSHOT/MavenEnterpri‌​seappejb/MyBean!com.test.MyInterface“