gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:44:01 25 4
gpt4 key购买 nike

我知道我可以只使用注释将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com