ZetCode

RESTEasy H2 教程

最后修改于 2023 年 1 月 10 日

RESTEasy H2 教程展示了如何在 RESTEasy 创建的 RESTful Web 应用程序中使用 H2 数据库。

RESTEasy

RESTEasy 是一个用于开发 RESTful Web 服务的 Java 框架。它是 JAX-RS 2.0 规范的完全认证和可移植的实现。JAX-RS 2.0 规范是 JCP(Java Community Process)规范,它提供了一个 Java API,用于通过 HTTP 协议访问 RESTful Web 服务。

RESTEasy 可以在任何 Servlet 容器中运行。它包含一套丰富的提供程序,如 XML、JSON、YAML、Fastinfoset、Multipart、XOP 和 Atom。

H2

H2 是一个用 Java 编写的关系数据库管理系统。它可以嵌入到 Java 应用程序中,或者以客户端-服务器模式运行。它也可以在内存模式下使用。

RESTEasy H2 示例

下面的示例是一个简单的 RESTful 应用程序,它返回 H2 数据库的版本。为了连接到数据库并执行查询,我们使用了 Spring 的 JdbcTemplate,这是一个基于纯 JDBC 的 Java 库。

$ tree
.
├── nb-configuration.xml
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── zetcode
    │   │           ├── conf
    │   │           │   └── AppResConfig.java
    │   │           ├── resource
    │   │           │   └── MyResource.java
    │   │           └── service
    │   │               └── VersionService.java
    │   ├── resources
    │   └── webapp
    │       └── META-INF
    │           └── context.xml
    └── test
        └── java

这是项目结构。

pom.xml
<?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
http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zetcode</groupId>
    <artifactId>RestEasyH2</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>RestEasyH2</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>3.1.4.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-servlet-initializer</artifactId>
            <version>3.1.4.Final</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.196</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>

        </plugins>
    </build>

</project>

这是 Maven POM 文件。它包含了 RESTEasy、H2 和 Spring JdbcTemplate 的依赖项。

context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/RestEasyH2"/>

在 Tomcat 的 context.xml 配置文件中,我们定义了应用的上下文路径。

AppConfig.java
package com.zetcode.conf;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("rest")
public class AppConfig extends Application {

}

这是应用程序配置类。Application 定义了 JAX-RS 应用程序的组件并提供额外的元数据。

@ApplicationPath("rest")

使用 @ApplicationPath 注解,我们设置了 RESTful Web 服务的路径。

VersionService.java
package com.zetcode.service;

import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;

public class VersionService {

    public static String getVersion() {

        SimpleDriverDataSource ds = new SimpleDriverDataSource();
        ds.setDriver(new org.h2.Driver());
        ds.setUrl("jdbc:h2:mem:");

        String sql = "SELECT H2VERSION()";

        JdbcTemplate jtm = new JdbcTemplate(ds);
        String version = jtm.queryForObject(sql, String.class);

        return version;
    }
}

VersionService 连接到在内存中创建的 H2 数据库并返回其版本。

SimpleDriverDataSource ds = new SimpleDriverDataSource();
ds.setDriver(new org.h2.Driver());
ds.setUrl("jdbc:h2:mem:");

我们创建了一个简单的数据源。使用 jdbc:h2:mem: URL 字符串,我们创建了一个仅供单个连接使用的内存私有数据库。数据库在数据库连接关闭时关闭。

String sql = "SELECT H2VERSION()";

此 SQL 语句返回 H2 的版本。

JdbcTemplate jtm = new JdbcTemplate(ds);
String version = jtm.queryForObject(sql, String.class);

我们使用 Spring JdbcTemplate 来执行 SQL 查询。

MyResource.java
package com.zetcode.resource;

import com.zetcode.service.VersionService;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("version")
public class MyResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String message() {

        String h2Version = VersionService.getVersion();

        String message = String.format("H2 version: %s", h2Version);
        return message;
    }
}

这是 MyResource 类。

@Path("version")
public class MyResource {

通过 @Path 注解,我们指定了资源响应的 URL。

@GET
@Produces(MediaType.TEXT_PLAIN)
public String message() {

    String h2Version = VersionService.getVersion();

    String message = String.format("H2 version on Tomcat 9: %s", h2Version);
    return message;
}

@GET 注解表明注解的方法响应 HTTP GET 请求。通过 @Produces 注解,我们定义该方法生成纯文本。我们调用服务方法并返回一个消息字符串。

$ curl localhost:8080/RestEasyH2/rest/version
H2 version: 1.4.196

应用程序部署在 Tomcat 上后,我们使用 curl 向应用程序发送一个 GET 请求。我们获得 H2 数据库的版本。

在本教程中,我们使用 RESTEasy 和 H2 数据库创建了一个简单的 RESTFul 应用程序。我们使用 Spring 的 JdbcTemplate 连接到 H2。该应用程序已部署在 Tomcat 上。