【问题标题】:External @EJB injection return null with RESTeasy and JBoss使用 RESTeasy 和 JBoss 的外部 @EJB 注入返回 null
【发布时间】:2026-01-12 14:45:02
【问题描述】:

我正在使用 RESTeasy 在 JBoss 6 Final 上开发一个 RESTful Web 服务。 我有一个外部 EJB,我想在 Web 服务上注入 EJB。

这是EJB的代码

BeanLocalInterface.java

@Local
public interface BeanLocalInterface {
  public String sayHello();
}

Bean.java

@Stateless
@LocalBinding(jndiBinding = "BeanLocal")
public class Bean implements BeanLocalInterface {

  @Override
  public String sayHello() {
    return "Hello!";
  }
}

在另一个项目中我有一个 WS:

@Path("/ws")
public class HelloWorldResource {

    @EJB(mappedName="BeanLocal")
    private BeanLocalInterface bean;

    @GET
    @Path("/hello")
    @Produces(MediaType.TEXT_PLAIN)
    public String sayHello() {            
        return bean.sayHello();
    }
}

MyRESTApplication.java

public class MyRESTApplication extends Application {

    private Set<Object> singletons = new HashSet<Object>();
    private Set<Class<?>> empty = new HashSet<Class<?>>();
    public MyRESTApplication(){
         singletons.add(new HelloWorldResource());
    }
    @Override
    public Set<Class<?>> getClasses() {
         return empty;
    }
    @Override
    public Set<Object> getSingletons() {
         return singletons;
    }
}

bean 始终为空!

我已经尝试过这个解决方案:

  • 我已将 @Stateless 放在 HelloWorldResources 上
  • 我已经在 WEB-INF 中创建 beans.xml
  • 我已更改 MyRESTApplication 与

    @ApplicationPath("wsapp") 公共类 MyRESTApplication 扩展应用程序 { }

你能帮帮我吗?

PS:我没有 EAR,我不想用它

【问题讨论】:

  • 我正在尝试实现同样的目标。如果您找到了解决方案,请告诉我。
  • 亲爱的@Fabio Mignogna,我也有同样的问题,请告诉我它是如何解决的......

标签: jboss ejb resteasy


【解决方案1】:

我已经设法解决了这个问题。首先,从 web.xml 中删除所有关于 RESTeasy 的设置。你只需要一个注解 --> @ApplicationPath

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("api")
public class MyRESTApplication extends Application {
//nothing required here, leave this empty

}

这是您的会话 bean 接口。

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;


@Path("MyEJB")
public interface BeanInterface {

@Path("{username}")
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayHello(@PathParam("username") String username);

}

这是你的会话 bean。

import javax.ejb.Stateless;

@Stateless
public class EJB implements BeanInterface{

@Override
public String sayHello(String username) {

    return "Hello, "+username;
}

}

使用 JBOSS 7.1

用法:http://localhost:8080 /YOURAPPNAME/api/MyEJB/Fabio

输出:你好,法比奥

希望这会有所帮助。

【讨论】:

  • 嗨阿德里安,感谢您的回复,但没有解决我的问题。我的 CRM 有几个 EJB,我想为我的 iPad 应用程序发布一些 Web 服务。我决定做一个查找。
  • 我很高兴遇到这个答案。它帮助我让 CDI 在 RESTeasy 服务中工作。你能解释一下为什么 MyRESTApplication 类的内容是空的吗?它确实有效,但为什么在这里添加单例会导致 CDI 失败?
  • 亲爱的@Adrian Stamin 它对我不起作用,如果您在 JBossEAP 或 Maven 中有任何其他配置,请告诉我...