gpt4 book ai didi

java - 如何使用 ServletContainerInitializer 映射 REST Web 服务?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:17 27 4
gpt4 key购买 nike

我想使用 ServletContainerInitializer 映射 REST API,我的代码是

@Override
public void onStartup(Set<Class<?>> classes, ServletContext container)
throws ServletException {
// TODO Auto-generated method stub
Map<String, String> map=new HashMap<String, String>();
map.put("com.sun.jersey.config.property.packages", "org.pack");

ServletRegistration.Dynamic dispatcher = container.addServlet(
"restful", new ServletContainer());
dispatcher.setInitParameters(map);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/rest/*");

}

应用程序运行没有任何错误,但未创建 web 服务。请指出我错在哪里以及如何在任何 Web 应用程序中使用 ServletContainerInitializer

提前致谢

最佳答案

据我了解,ServletContainerInitializer 是基于服务提供者模式。我前段时间浏览了一个关于它的教程,现在找不到了。但是您可以在 ServiceLoader 中看到一些要求javadocs。它指出:

A service provider is identified by placing a provider-configuration file in the resource directory META-INF/services. The file's name is the fully-qualified binary name of the service's type. The file contains a list of fully-qualified binary names of concrete provider classes, one per line.

我为使您的示例运行所采取的步骤:

使用这些依赖项创建一个 Maven jar 项目

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>

创建一个 META-INF/services 目录。你可以直接放在 src 中,或者用 Maven 我喜欢把它放在 src/main/resources 中。他们最终都会在同一个地方。

创建一个名为 javax.servlet.ServletContainerInitializer 的文件,并将您的 ServletContainerInitializer 实现的完全限定名称放入其中。将文件放在 META-INF/services 中。这是我的

 META-INF/services/
javax.servlet.ServletContainerInitializer

// content
jersey.servlet.initializer.MyJerseyContainerInitializer

enter image description here

初始化类

package jersey.servlet.initializer;

import com.sun.jersey.spi.container.servlet.ServletContainer;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

public class MyJerseyContainerInitializer implements ServletContainerInitializer{

@Override
public void onStartup(Set<Class<?>> set, ServletContext sc)
throws ServletException {
System.out.println("===============================================");
System.out.println(" onStartup() ");
System.out.println("===============================================");
Map<String, String> map = new HashMap<>();
map.put("com.sun.jersey.config.property.packages",
"jersey.servlet.initializer.rest");

ServletRegistration.Dynamic dispatcher = sc.addServlet(
"restful", new ServletContainer());
dispatcher.setInitParameters(map);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/rest/*");
}
}

还有一个简单的rest资源类

package jersey.servlet.initializer.rest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;

@Path("/resource")
public class Resource {

@GET
public Response getResponse() {
return Response.ok("ServletContainerInitializer test OK!").build();
}
}

然后我构建了 jar 并将其安装到本地 repo。然后再创建一个Maven web项目,将上面的jar加入到项目中。就是这样。在 Tomcat 8 和 7 以及 BAM 上运行它

enter image description here


除此之外

jersey-serlvet.jar(需要使用您正在使用的 ServletContainer 类)已随 com.sun.jersey.server.impl.container.servlet.JerseyServletContainerInitializer 一起提供。 .为什么我们需要创建自己的?


编辑

Its work on maven but i want to do it without maven. Would i have to add project jar into the lib folder for without maven.

是的,您可以为初始化程序 .jar(包括 Jersey jar)构建一个胖 jar。然后,您需要将 Web 项目放在 WEB-INF/lib 中。所有 Maven 确实帮助解决依赖关系并构建 .war 文件。它还会将初始化程序 jar 放入 Web 应用程序的 WEB-INF/lib 中。所以只是照做,不使用 Maven。如果你不想构建一个 fat jar,只需确保所有依赖项都包含在 lib 中

关于java - 如何使用 ServletContainerInitializer 映射 REST Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27437566/

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