获取 RESTful 自 EJB 以来的列表

Get list to RESTful since EJB

我有一个项目 maven - EAR,同样我有一个 RESTful JAX-RS 可以与球衣一起使用并且它正在使用 JSON,当我尝试获取列表到 RESTful自从EJB,带来的不是什么。但是,当在同一个 REST 中添加列表时,它运行良好。!

这是 RESTful 与列表相同的 class!。

@Path("/courseMockRS")
@Consumes({"application/json"})
@Produces({"application/json"})
public class CourseMock_RS {

@GET
@Path("/all_courses")
public List<CourseMock> AllCourses() {
    List<CourseMock> courses = getCoursesMock();
    return courses;
}

public List<CourseMock> getCoursesMock() {
    List<CourseMock> coursesMocks = new ArrayList<CourseMock>();

    CourseMock mock = new CourseMock();
    mock.setName("SOA Analist");
    mock.setAuthor("SOA Education");
    mock.setReleaseDate("16/07/2015");
    coursesMocks.add(mock);

    mock = new CourseMock();
    mock.setName("SOA Architect");
    mock.setAuthor("SOA ET");
    mock.setReleaseDate("16/07/2015");
    coursesMocks.add(mock);

    mock = new CourseMock();
    mock.setName("SOA Consultant");
    mock.setAuthor("SOA ET");
    mock.setReleaseDate("16/07/2015");
    coursesMocks.add(mock);

    return coursesMocks;
}
}

这样效果很好!

[{"name":"SOA Analist","author":"SOA Education","releaseDate":"16/07/2015"},    
{"name":"SOA Architect","author":"SOA ET","releaseDate":"16/07/2015"},
{"name":"SOA Consultant","author":"SOA ET","releaseDate":"16/07/2015"}]

但是当找不到实现 EJB 时!,但是部署了应用程序并接受了无状态资源。

这是来自 EJB 的资源。

DTO

public class CourseMock {

private String name;
private String author;
private String releaseDate;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

public String getReleaseDate() {
    return releaseDate;
}

public void setReleaseDate(String releaseDate) {
    this.releaseDate = releaseDate;
}   
}

外观

@Stateless
@LocalBean
public class CourseFacadeMock implements ICourseMockFacade{

private CourseMock mock;

@Override
public List<CourseMock> getCoursesMock() {
    List <CourseMock> coursesMocks = new ArrayList<CourseMock>();

    mock= new CourseMock();
    mock.setName("Analista SOA");
    mock.setAuthor("SOA Education");
    mock.setReleaseDate("16/07/2015");        
    coursesMocks.add(mock);

    mock= new CourseMock();
    mock.setName("SOA Analist");
    mock.setAuthor("SOA Education");
    mock.setReleaseDate("16/07/2015");
    coursesMocks.add(mock);

    mock = new CourseMock();
    mock.setName("SOA Architect");
    mock.setAuthor("SOA ET");
    mock.setReleaseDate("16/07/2015");
    coursesMocks.add(mock);

    mock = new CourseMock();
    mock.setName("SOA Consultant");
    mock.setAuthor("SOA ET");
    mock.setReleaseDate("16/07/2015");
    coursesMocks.add(mock);

    return coursesMocks;

}

}

界面立面

@Local
public interface ICourseMockFacade {

public List<CourseMock> getCoursesMock();
}

还有 RESTful

@Path("/courseMockRS")
@Consumes({"application/json"})
@Produces({"application/json"})
public class CourseMock_RS {

@EJB
ICourseMockFacade courseMockFacade;

@GET
@Path("/all_courses")
public List<CourseMock> AllCourses() {
    List<CourseMock> courses = courseMockFacade.getCoursesMock();
    return courses;
}    
}

因此失败。异常是 NUllPointerException。 请帮忙!

好的,看起来 courseMockFacade 没有被注入 CourseMock_RS。原因是@EJB 注释是为在 EJB 中使用而设计的,您不能将它放入任意 类 列表 JAXRS 接口中。

要获取 ICourseMockFacade 对象,您可以使用 JNDI 查找,例如:

ICourseMockFacade courseMockFacade=lookupCourseFacade();

private ICourseMockFacade lookupCourseFacade(){
    return (ICourseMockFacade)new InitialContext().lookup("java:module/CourseMockFacade");
}

有一些注意事项:我在这里假设您有一个实现 ICourseMockFacade 的 EJB CourseMockFacade,并且 JNDI 地址将取决于您的部署 - full details here

我已经使用您的代码创建了一个项目,假设您已将 JAX-RS 配置 class 设置为类似以下内容,它可以完美运行:

@ApplicationPath("resources")
public class JAXRSConfiguration extends Application {

}

在这种情况下,如果没有注入 EJB,也许问题出在您的 beans.xml 文件中,属性 bean-discovery-mode 应该设置为 "all" .例如:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
   bean-discovery-mode="all">
</beans>

希望对您有所帮助。