rest - 从 EJB 模块将 EJB 公开为 JAX-RS

标签 rest jboss ejb resteasy jboss6.x

我知道我可以只使用注释将 web 模块中的类公开为一个 Restful 接口(interface)。现在我想做一些更复杂的事情。

我在我耳内的 ejb 模块中有一个无状态 EJB,并希望使用 jax-rs 将此 bean 公开为一个安静的接口(interface)。在第一步中,我用 @Path 注释了 EJB 类。和 @GET .它没有用。

当我使用 web.xml 创建一个额外的 web 模块时,它可以工作。包含

<context-param>
    <param-name>resteasy.jndi.resources</param-name>
    <param-value>myear/testService/no-interface,myear/testService2/no-interface</param-value>
</context-param>
<listener>
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
    <servlet-name>rest</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>rest</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

我可以公开一个只有注释的简单类,所以我不太相信我必须显式配置我想在配置文件中公开的每个 EJB。

有没有更简单/更好的方法?

我正在使用 JBoss 6.1

最佳答案

应该不需要任何配置。如果您愿意查看另一个容器——至少出于引用目的——这里有一个将@Singleton EJB 公开为JAX-RS 服务和@LocalBean 的示例。

bean 本身使用 Container-Managed Transactions 和 JPA,在实际 JAX-RS 消息中使用 JPA @Entity 对象——有效地将 EntityManager 转变为事务性 JAX-RS 服务。

EJB 类的一小部分:

@Singleton
@Lock(LockType.WRITE)
@Path("/user")
@Produces(MediaType.APPLICATION_XML)
public class UserService {

    @PersistenceContext
    private EntityManager em;

    @Path("/create")
    @PUT
    public User create(@QueryParam("name") String name,
                       @QueryParam("pwd") String pwd,
                       @QueryParam("mail") String mail) {
        User user = new User();
        user.setFullname(name);
        user.setPassword(pwd);
        user.setEmail(mail);
        em.persist(user);
        return user;
    }

    @Path("/list")
    @GET
    public List<User> list(@QueryParam("first") @DefaultValue("0") int first,
                           @QueryParam("max") @DefaultValue("20") int max) {
        List<User> users = new ArrayList<User>();
        List<User> found = em.createNamedQuery("user.list", User.class).setFirstResult(first).setMaxResults(max).getResultList();
        for (User u : found) {
            users.add(u.copy());
        }
        return users;
    }

这是它的单元测试的一部分(使用 Embeddable EJBContainer API):
public class UserServiceTest {
    private static Context context;
    private static UserService service;
    private static List<User> users = new ArrayList<User>();

    @BeforeClass
    public static void start() throws NamingException {
        Properties properties = new Properties();
        properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
        context = EJBContainer.createEJBContainer(properties).getContext();

        // create some records
        service = (UserService) context.lookup("java:global/rest-on-ejb/UserService");
        users.add(service.create("foo", "foopwd", "foo@foo.com"));
        users.add(service.create("bar", "barpwd", "bar@bar.com"));
    }

    @Test
    public void list() throws Exception {
        String users = WebClient.create("http://localhost:4204")
                .path("/user/list")
                .get(String.class);
        assertEquals(
            "<users>" +
                "<user>" +
                    "<email>foo@foo.com</email>" +
                    "<fullname>foo</fullname>" +
                    "<id>1</id>" +
                    "<password>foopwd</password>" +
                "</user>" +
                "<user>" +
                    "<email>bar@bar.com</email>" +
                    "<fullname>bar</fullname>" +
                    "<id>2</id>" +
                    "<password>barpwd</password>" +
                "</user>" +
            "</users>", users);
    }

示例的完整来源 here .整个示例只有三个类(包括测试)和一个 persistence.xml 文件。

关于rest - 从 EJB 模块将 EJB 公开为 JAX-RS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7349513/

相关文章:

java - HTTP 状态 500 - ... IllegalArgumentException : Unknown return value type when I use ResponseStatus annotation and return value in spring controller

perl - 从 teamcity 构建中获取工件列表并仅下载确切的一个

SharePoint 2010 Web 服务上的 Java JBoss 401 错误

java - 是否有可能以及如何将一些额外的参数传递给 Java 中的拦截器?

web-services - Jersey 客户端异常 : A message body writer was not found

java - 使用jdk1.3的轻量级java web框架

java - EJB 计时器忽略 TransactionTimeout

jakarta-ee - 哪个是学习EJB的最佳EJB容器?

java - 无法使用线程对 EJB 主题实现负载测试

java - 如何在 TomEE+ 中配置 Apache CXFignoreNamespaces?