在 java 应用程序中嵌入球衣
Embed jersey in java application
我正在尝试在我的 java 应用程序中嵌入球衣服务器,以便我可以通过编程方式控制其 starting/stopping 等。我找到了 this 教程,但它适用于码头 1.18。 1(相当旧)。使用最新的球衣版本 (2.22.1) 似乎 类、名称空间等方面发生了很多变化,上面教程中显示的示例不起作用。
有人可以指出在自定义应用程序中嵌入 last 球衣版本的方法吗?我相信这是可行的,但我似乎找不到参考、文档、示例或其他任何内容...
正如 Gimby 所建议的,documentation 提供了答案。 Jersey 可以嵌入到 java 应用程序中,使用另一个 http 服务器(例如 jetty)。就我而言,我通过以下三个步骤构建了一个非常简单的工作示例项目:
在我的 pom.xml 中添加了相应的 Maven 依赖项。 请注意,我只对 jersey 项目的码头连接器有 maven 依赖。我对码头服务器本身没有依赖性。同时拥有它们会导致错误。
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.22.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-jetty-http</artifactId>
<version>2.22.1</version>
</dependency>
构建了一个简单的 REST 资源class
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;
@Path("testingservice/")
public class TestingRESTService {
@GET
@Path("{requestID}")
@Produces(MediaType.TEXT_PLAIN)
public String get(@PathParam("requestID") String requestID) {
return "\n This is request with ID "+requestID;
}
}
在main函数中添加了启动嵌入式REST服务器的代码
import java.io.IOException;
import java.net.URI;
import javax.ws.rs.core.UriBuilder;
import org.eclipse.jetty.server.Server;
import org.glassfish.jersey.jetty.JettyHttpContainerFactory;
import org.glassfish.jersey.server.ResourceConfig;
@SuppressWarnings("restriction")
public class TestingApplicationStartingRESTServerProgrammatically {
public static void main(String[] args) throws Exception {
URI baseUri = UriBuilder.fromUri("http://localhost/").port(9998).build();
ResourceConfig config = new ResourceConfig(CrunchifyAPI.class);
Server server = JettyHttpContainerFactory.createServer(baseUri, config);
server.start();
}
}
如果您想将它嵌入到较低级别 API 以防您选择将 Web 引擎更改为类似 Netty 或 Vert.X 的内容,您必须转到 org.glassfish.jersey.servlet.WebComponent
您需要使用 WebConfig
构建它,并且您需要创建自己的 HttpServletRequest/Response/Context 类.
实现
您可以通过构建自己的 ApplicationHandler
来降低,但在那个阶段它几乎是 Jersey 的内部结构。在 WebComponent 级别,您仍然拥有 servlet API,因此更容易构建您需要的内容。
我正在尝试在我的 java 应用程序中嵌入球衣服务器,以便我可以通过编程方式控制其 starting/stopping 等。我找到了 this 教程,但它适用于码头 1.18。 1(相当旧)。使用最新的球衣版本 (2.22.1) 似乎 类、名称空间等方面发生了很多变化,上面教程中显示的示例不起作用。
有人可以指出在自定义应用程序中嵌入 last 球衣版本的方法吗?我相信这是可行的,但我似乎找不到参考、文档、示例或其他任何内容...
正如 Gimby 所建议的,documentation 提供了答案。 Jersey 可以嵌入到 java 应用程序中,使用另一个 http 服务器(例如 jetty)。就我而言,我通过以下三个步骤构建了一个非常简单的工作示例项目:
在我的 pom.xml 中添加了相应的 Maven 依赖项。 请注意,我只对 jersey 项目的码头连接器有 maven 依赖。我对码头服务器本身没有依赖性。同时拥有它们会导致错误。
<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>2.22.1</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-jetty-http</artifactId> <version>2.22.1</version> </dependency>
构建了一个简单的 REST 资源class
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; @Path("testingservice/") public class TestingRESTService { @GET @Path("{requestID}") @Produces(MediaType.TEXT_PLAIN) public String get(@PathParam("requestID") String requestID) { return "\n This is request with ID "+requestID; } }
在main函数中添加了启动嵌入式REST服务器的代码
import java.io.IOException; import java.net.URI; import javax.ws.rs.core.UriBuilder; import org.eclipse.jetty.server.Server; import org.glassfish.jersey.jetty.JettyHttpContainerFactory; import org.glassfish.jersey.server.ResourceConfig; @SuppressWarnings("restriction") public class TestingApplicationStartingRESTServerProgrammatically { public static void main(String[] args) throws Exception { URI baseUri = UriBuilder.fromUri("http://localhost/").port(9998).build(); ResourceConfig config = new ResourceConfig(CrunchifyAPI.class); Server server = JettyHttpContainerFactory.createServer(baseUri, config); server.start(); } }
如果您想将它嵌入到较低级别 API 以防您选择将 Web 引擎更改为类似 Netty 或 Vert.X 的内容,您必须转到 org.glassfish.jersey.servlet.WebComponent
您需要使用 WebConfig
构建它,并且您需要创建自己的 HttpServletRequest/Response/Context 类.
您可以通过构建自己的 ApplicationHandler
来降低,但在那个阶段它几乎是 Jersey 的内部结构。在 WebComponent 级别,您仍然拥有 servlet API,因此更容易构建您需要的内容。