教程:您的第一个 RESTful web service
本教程讲述如何在 IntelliJ IDEA 中创建一个简单的 RESTful 网络服务并将其部署到 Tomcat GlassFish 应用服务器上。 当您通过网络浏览器访问特定 URL 或以其他方式向该 URL 发送 GET 请求时,该服务将输出 Hello, World!
。 请使用本页面顶部的切换器查看其他应用服务器的说明。
您将创建一个新的 Java Enterprise 项目,添加必要的 Java 代码,告诉 IntelliJ IDEA 您的 GlassFish Tomcat 服务器的位置,然后使用运行配置来构建构件,启动服务器,并将构件部署到服务器上。
您将需要以下内容:
IntelliJ IDEA Ultimate | 免费 IntelliJ IDEA 社区版不支持 Java Enterprise / Jakarta Enterprise 开发。 如需更多信息,请参阅 IntelliJ IDEA Ultimate 与 IntelliJ IDEA Community Edition |
相关插件 | 默认情况下,以下必要插件已捆绑并在 IntelliJ IDEA Ultimate 中启用。 如果某些功能无法正常运行,请确保以下插件已启用:
安装并启用 GlassFish插件,如 安装插件 所述。 |
Java SE Development Kit (JDK) 版本 1.8 或更高版本 | 您可以按照 Java Development Kit (JDK) 中的描述直接从 IntelliJ IDEA 获取 JDK,也可以手动下载并安装,例如: Oracle JDK 或 OpenJDK。 |
Tomcat | Tomcat 应用程序服务器版本 7 或更高版本。 |
Glassfish | GlassFish 应用服务器版本 4.0 或更高版本。 您可以从 官方仓库获取最新版本。 此教程的目的应该仅需要 Web Profile子集。 |
网页浏览器 | 您将需要一个 Web 浏览器来查看您的 Web 应用程序。 |
创建一个新的 Java Enterprise 项目
IntelliJ IDEA 包含一个专门用于基于各种 Java EE 和 Jakarta EE 实现创建 Java 企业项目的向导。 在本教程中,我们将创建一个简单的 Web 应用程序。
在主菜单中,前往
。在 新建项目 对话框中,选择 Jakarta EE。
请输入您的项目名称:
RestGlassfishHelloWorld
RestTomcatHelloWorld
。 本教程中,请使用 Oracle OpenJDK 21 作为项目 SDK 并选择 REST 服务 模板。 请勿选择或添加应用服务器,我们稍后会处理。 选择 Java 和 Maven。 点击 下一步(N) 继续。在 版本(V) 字段中,选择 Jakarta EE 10 ,因为这是 Tomcat 10.1 在本教程中兼容的。
在 版本(V) 字段中,选择 Jakarta EE 9.1 ,因为这是本教程中使用的 GlassFish 6.2.5 所兼容的。
在 依赖项 列表中,选择以下内容:
上下文和依赖项注入 (CDI)
RESTful Web 服务 (JAX-RS)
Servlet
Eclipse Jersey 服务器
Weld SE
点击 创建(C)。
探索默认项目结构
IntelliJ IDEA 创建了一个项目,包含一些可以成功构建和部署的样板代码。
pom.xml 是带有 Maven 配置信息的 项目对象模型 ,包括构建项目所需的依赖项和插件。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>RestTomcatHelloWorld</artifactId> <version>1.0-SNAPSHOT</version> <name>RestTomcatHelloWorld</name> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.target>21</maven.compiler.target> <maven.compiler.source>21</maven.compiler.source> <junit.version>5.11.0-M2</junit.version> </properties> <dependencies> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency><dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>4.0.0-M1</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>4.0.0-M1</version> </dependency> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-cdi2-se</artifactId> <version>4.0.0-M1</version> </dependency><dependency> <groupId>org.jboss.weld.se</groupId> <artifactId>weld-se-core</artifactId> <version>6.0.0.Beta1</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.4.0</version> </plugin> </plugins> </build> </project><?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>RestTomcatHelloWorld</artifactId> <version>1.0-SNAPSHOT</version> <name>RestTomcatHelloWorld</name> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.source>11</maven.compiler.source> <junit.version>5.9.2</junit.version> </properties> <dependencies> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>3.0.4</version> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>3.0.4</version> </dependency> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-cdi2-se</artifactId> <version>3.0.4</version> </dependency> <dependency> <groupId>org.jboss.weld.se</groupId> <artifactId>weld-se-core</artifactId> <version>4.0.3.Final</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin> </plugins> </build> </project>HelloResource.java 是一个实现 RESTful 网络服务的 根资源类 ,它使用以下 JAX-RS 注解:
@Path
注解识别用于访问此资源的 URI,相对于应用程序根目录。@GET
注解表明hello()
方法将处理发送到指定 URI 的 HTTP GET 请求。@Produces
注解指定了方法生成和返回的 MIME 媒体类型。
package com.example.restglassfishhelloworld; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; @Path("/hello-world") public class HelloResource { @GET @Produces("text/plain") public String hello() { return "Hello, World!"; } }package com.example.resttomcathelloworld; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; @Path("/hello-world") public class HelloResource { @GET @Produces("text/plain") public String hello() { return "Hello, World!"; } }HelloApplication.java 是
javax.ws.rs.core.Application
的子类,用于配置应用程序运行资源类中定义的 REST 资源的环境。@ApplicationPath
注释标识了应用根的 URL 映射(默认情况下,它被设置为/api
)。package com.example.restglassfishhelloworld; import jakarta.ws.rs.ApplicationPath; import jakarta.ws.rs.core.Application; @ApplicationPath("/api") public class HelloApplication extends Application { }package com.example.resttomcathelloworld; import jakarta.ws.rs.ApplicationPath; import jakarta.ws.rs.core.Application; @ApplicationPath("/api") public class HelloApplication extends Application { }
配置应用服务器
让 IntelliJ IDEA 知道 GlassFish Tomcat 应用服务器的位置。
按 Ctrl+Alt+S 打开设置,然后选择
。点击
并选择 Glassfish 服务器Tomcat。
请指定 GlassFish Tomcat 服务器的安装位置。 IntelliJ IDEA 会适当地检测并设置名称和版本。
创建运行配置
IntelliJ IDEA 需要一个运行配置来构建工件并将其部署到您的应用服务器。
在主菜单中,前往
。在 运行/调试配置 对话框中,点击
,展开 Glassfish 服务器Tomcat 服务器 节点,并选择 本地。
修复出现在运行配置设置对话框底部的任何警告。
您很可能需要修复以下问题:
在 服务器 选项卡上,将 服务器域名 设置为
domain1
。在 部署 选项卡上,添加您想要部署的工件:
RestGlassfishHelloWorld:war exploded
RestTomcatHelloWorld:war exploded
在 服务器 选项卡上,将 URL 设置为指向 根资源:
http://localhost:8080/RestGlassfishHelloWorld-1.0-SNAPSHOT/api/hello-worldhttp://localhost:8080/RestTomcatHelloWorld_war_exploded/api/hello-world点击 确定(O) 以保存运行配置。
要运行配置,请按 Alt+Shift+F10 并选择创建的应用服务器配置。
或者,如果您在顶部主工具栏中选择了运行配置,您可以点击主工具栏中的
或按 Shift+F10 运行它。
此运行配置会构建构件,然后启动 GlassFish Tomcat服务器,并将构件部署到服务器。 您应当在 服务 工具窗口中看到相应的输出。


一旦完成此操作,IntelliJ IDEA 会在您的网页浏览器中打开指定的 URL。

如果没有,请尝试自行打开 URL: http://localhost:8080/RestGlassfishHelloWorld-1.0-SNAPSHOT/api/hello-world http://localhost:8080/RestTomcatHelloWorld_war_exploded/api/hello-world
故障排除
与 Jakarta EE 的兼容性
如果您收到 404
错误,请确保在 创建项目时选择了与您的 GlassFish 版本兼容的 Jakarta EE 规范版本。
如需更多信息,请参阅 GlassFish 版本兼容性。
较旧版本 IntelliJ IDEA
如果您使用 IntelliJ IDEA 版本 2020.2.2 或更早版本, 新建项目 向导将不会添加 Tomcat 所需的所有必要依赖项。 在这种情况下,打开 pom.xml 并添加以下依赖项:
例如,在 2020.2.3 版本中,生成的 pom.xml 看起来像这样: