2013-03-19 63 views
1

我正在用RESTeasy在JBoss 6 Final上开发一个RESTful Web服务。 我有一个外部的EJB,我想在Web服务上注入EJB。External @EJB注入RESTeasy和JBoss返回null

这是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(); 
    } 
} 

MyRESTApplicati on.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 is alwasy null!

我曾尝试这种解决方案:

  • 我已经把@Stateless上HelloWorldResources
  • 我创建beans.xml的WEB-INF
  • 我有

    变化MyRESTApplication @ ApplicationPath(“wsapp”) public class MyRESTApplication extends Application { }

你能帮我吗?

PS:我没有EARË我不想使用它

+0

我试图达到同样的目的。如果您找到解决方案,请告诉我。 – 2014-02-16 11:52:09

回答

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://本地主机:8080/YOURAPPNAME/API/MyEJB /法比奥

输出:您好,法比奥

希望这有助于。

+0

嗨艾德里安,谢谢你的回应,但没有解决我的问题。我的CRM有几个EJB,我想为iPad应用程序发布一些Web服务。我决心做一个查询。 – 2014-02-17 15:16:39

+0

我很高兴遇到这个答案。它帮助我让CDI在RESTeasy服务中工作。你能解释为什么MyRESTApplication课程内容是空的吗?它确实有效,但为什么在这里添加单例导致CDI失败? – dave823 2014-03-18 16:32:36