如何将Java EJB应用中的业务服务暴露为REST接口?
别担心,完全不需要新建项目!咱们可以直接在你现有的项目结构里扩展,把EJB业务服务暴露成REST接口,用Java EE自带的JAX-RS(Java API for RESTful Web Services)就能轻松搞定,和你的EJB完美兼容。
下面是结合你项目结构的具体步骤:
1. 选择合适的模块放置REST代码
你的项目里已经有exampleApp-web模块,这是放置REST接口的最佳位置——Web模块可以直接注入EJB模块的服务,而且EAR包下的模块共享类路径,依赖完全没问题。
2. 确保JAX-RS依赖到位
如果你用的是WildFly、GlassFish这类标准Java EE服务器,它们本身就自带JAX-RS的实现(比如RESTEasy或Jersey),所以你只需要在exampleApp-web模块里添加JAX-RS的API依赖即可。如果是Maven项目,在pom.xml里加:
<dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.1.1</version> <scope>provided</scope> <!-- 服务器自带,所以设为provided --> </dependency>
如果是NetBeans的Java EE项目,也可以右键exampleApp-web模块,选择New > RESTful Web Service,NetBeans会自动帮你配置好依赖和基础代码。
3. 创建REST资源类,注入你的EJB服务
新建一个Java类作为REST接口的入口,注入你已经写好的ServicesClientLocal,然后把业务方法包装成REST接口。比如:
import javax.ejb.EJB; 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; // REST接口的根路径,比如 /clients @Path("/clients") // 指定返回的媒体类型为JSON @Produces(MediaType.APPLICATION_JSON) public class ClientRestResource { // 注入你的EJB服务 @EJB private ServicesClientLocal servicesClient; // 示例:根据ID获取客户端的GET接口 @GET @Path("/{clientId}") public Client getClient(@PathParam("clientId") Long clientId) { // 直接调用EJB里的业务逻辑 return servicesClient.findClientById(clientId); } // 你可以继续添加其他接口,比如POST创建客户端、PUT更新、DELETE删除等 }
注意:如果你的实体类Client要返回JSON,需要确保它能被序列化——可以给实体类加上@XmlRootElement注解,服务器自带的Jackson会自动处理POJO的序列化。
4. 配置JAX-RS应用类
这个类用来告诉服务器哪些是REST资源,以及REST接口的根路径。新建一个类:
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; // 这里是所有REST接口的前缀,比如 http://localhost:8080/exampleApp-web/api @ApplicationPath("/api") public class RestApiApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> resources = new HashSet<>(); // 把刚才创建的REST资源类加进来 resources.add(ClientRestResource.class); return resources; } }
5. 部署测试
重新部署你的exampleApp-ear到服务器,然后就可以通过URL访问REST接口了。比如上面的示例接口,访问地址是:http://localhost:8080/exampleApp-web/api/clients/1
这样就把你的EJB业务服务通过REST接口暴露出来了,完全复用了现有项目的代码,不需要额外新建项目。如果你在NetBeans里操作,用它的RESTful Web Service向导会更快捷,它会自动生成应用类和资源类的模板,你只需要注入EJB并编写业务方法的包装逻辑就行。
内容的提问来源于stack exchange,提问作者basileLeBienheureux

