使用 RESTeasy 和 JBoss 的外部 @EJB 注入返回 null

Posted

技术标签:

【中文标题】使用 RESTeasy 和 JBoss 的外部 @EJB 注入返回 null【英文标题】:External @EJB injection return null with RESTeasy and JBoss 【发布时间】:2013-03-08 02:02:15 【问题描述】:

我正在使用 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,我也有同样的问题,请告诉我它是如何解决的...... 【参考方案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 中有任何其他配置,请告诉我...

以上是关于使用 RESTeasy 和 JBoss 的外部 @EJB 注入返回 null的主要内容,如果未能解决你的问题,请参考以下文章

JAX-RS + JBoss 7.1.1 + RESTEasy:使用 CDI 的 NullPointException

Springboot 与 RestEasy 集成并部署到 Jboss 服务器

org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure:找不到响应对象类型的 MessageBodyWriter

RestEASY + Jboss 7.x - 当 Accepts 与 @Produces 值不匹配时,您可以默认使用第一个 @Path 吗?

Jboss Wildfly resteasy 升级

无法在 Jboss 7 中添加 resteasy 本地模块