【问题标题】:How to add a Jersey REST webservice into embedded tomcat?如何将 Jersey REST Web 服务添加到嵌入式 tomcat 中?
【发布时间】:2014-01-16 19:50:56
【问题描述】:

基本上我想在嵌入的 Tomcat 8 中运行一些 Rest 类。 我不确定如何将它们添加到我正在创建的 tomcat 嵌入式实例中。 所以这就是我所做的。 这里只是那个 Jersey 类:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import static javax.ws.rs.core.MediaType.*;

@Path("register")
public class RegisterRestAPI {

    private MerchantRegistrationService merchantRegistrationService;

public RegisterRestAPI(MerchantRegistrationService merchantRegistrationService) {
    this.merchantRegistrationService = merchantRegistrationService;
}

    @GET
    @Produces(TEXT_PLAIN)
    public String register() {
        return "Hello!!!!";
    }
}

这是我创建 Tomcat 的类:

import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer;

import javax.servlet.ServletException;
import java.io.File;


public class TomcatServer {

private MerchantRegistrationService merchantRegistrationService;

public TomcatServer(MerchantRegistrationService merchantRegistrationService) 
{
    this.merchantRegistrationService = merchantRegistrationService;
}


public void start() throws ServletException, LifecycleException {
    String webappDirLocation = "restui/src/main/webapp/";
    Tomcat tomcat = new Tomcat();

    String webPort = System.getenv("PORT");
    if(webPort == null || webPort.isEmpty()) {
        webPort = "8080";
    }

    tomcat.setPort(Integer.valueOf(webPort));
    Context context = tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath());

    tomcat.addServlet(context,"jersey-container-servlet",resourceConfig());
    context.addServletMapping("/register", "registration rest");

    tomcat.start();
    tomcat.getServer().await();
}

private ServletContainer resourceConfig() {
    return new ServletContainer(new ResourceConfig().register(new 
        RegisterRestAPI(merchantRegistrationService)));
    }
}

如您所见,带问号的部分让我难以创建。 另外,只有一个 lats 问题,这是我应该将这些类添加到在服务器上运行的方式吗?

更新 我添加了 Michal Gajdos 建议的行,但在启动时我得到:

线程“main”中的异常 java.lang.IllegalArgumentException: Servlet 映射指定一个未知的 servlet 名称注册休息在 org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3160) 在 org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3139) 在 com.crypto.restui.TomcatServer.start(TomcatServer.java:44) 在 com.crypto.assembler.Boot.main(Boot.java:22) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

我应该如何调用 servlet?

【问题讨论】:

  • 感谢您提供此代码示例。由于某种原因,网络上其他任何地方都没有给出这个。是的,我遇到了与下面的答案相同的问题,非常感谢。

标签: java rest tomcat jersey


【解决方案1】:

ServletContainer 扩展 HttpServlet 并可以传递给底层的 servlet 容器,只需创建新实例:

new ServletContainer(new ResourceConfig(RegisterRestAPI.class));

您还可以在 web.xml 中定义 servlet 并将对该描述符的引用传递给 Tomcat - 与为 Jetty here 所做的类似。

【讨论】:

  • 我以某种方式按照你说的做了。所以我添加了 servlet,但名称呢?我收到关于 servlet 名称的异常?我应该怎么称呼它?(见上面的更新)
  • 尝试将registration rest改为jersey-container-servlet,使servlet的名称和对servlet的映射引用相同。
  • 是的,就是这样。非常感谢。我对嵌入式容器有点新,我需要学习一下:) 再见!
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 2016-02-25
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2015-06-04
  • 2015-10-08
相关资源
最近更新 更多