Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在jersey 2中注册对象(ResourceConfig)_Java_Maven_Tomcat_Jersey 2.0_Jdbi - Fatal编程技术网

Java 如何在jersey 2中注册对象(ResourceConfig)

Java 如何在jersey 2中注册对象(ResourceConfig),java,maven,tomcat,jersey-2.0,jdbi,Java,Maven,Tomcat,Jersey 2.0,Jdbi,我想在类引用中注册一个类组件(对象)。 我创建了一个XYZResource类,该类由main()方法调用,它可以通过jersey和DBI对象进行配置DAOService DAOService具有连接DBI连接和执行查询并返回结果的getDetails() 我使用IntelliJ IDE并运行Main Classcom.example.Main 当我点击我的urlhttp://localhost:9000/resource/test通过错误将其删除 javax.servlet.ServletExc

我想在类引用中注册一个类组件(对象)。 我创建了一个
XYZResource
类,该类由
main()
方法调用,它可以通过jersey和
DBI
对象进行配置
DAOService DAOService
具有连接DBI连接和执行查询并返回结果的getDetails()

我使用IntelliJ IDE并运行Main Class
com.example.Main

当我点击我的url
http://localhost:9000/resource/test
通过错误将其删除

javax.servlet.ServletException: A MultiException has 1 exceptions.  They are:
1. java.lang.NoSuchMethodException: Could not find a suitable constructor in com.example.AdminResource class.

    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:392)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:382)
    org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:535)
    org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:483)
    org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:420)
root cause

A MultiException has 1 exceptions.  They are:
1. java.lang.NoSuchMethodException: Could not find a suitable constructor in com.example.AdminResource class.

    org.jvnet.hk2.internal.Collector.throwIfErrors(Collector.java:88)
    org.jvnet.hk2.internal.Utilities.justCreate(Utilities.java:852)
    org.jvnet.hk2.internal.ServiceLocatorImpl.create(ServiceLocatorImpl.java:814)
    org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:906)
    org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:898)
    org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:174)
    org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:185)
    org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:103)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:128)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:131)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:131)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:131)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:131)
    org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:110)
    org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:65)
    org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)
    org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:250)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:318)
    org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:236)
    org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1010)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:382)
    org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:535)
    org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:483)
    org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:420)
root cause

java.lang.NoSuchMethodException: Could not find a suitable constructor in com.example.AdminResource class.
    org.glassfish.jersey.internal.inject.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:189)
    org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:159)
    org.jvnet.hk2.internal.Utilities.justCreate(Utilities.java:850)
    org.jvnet.hk2.internal.ServiceLocatorImpl.create(ServiceLocatorImpl.java:814)
    org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:906)
    org.jvnet.hk2.internal.ServiceLocatorImpl.createAndInitialize(ServiceLocatorImpl.java:898)
    org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:174)
    org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:185)
    org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:103)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:128)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:131)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:131)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:131)
    org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:131)
    org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:110)
    org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:65)
    org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)
    org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:250)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:318)
    org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:236)
    org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1010)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:382)
    org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:535)
    org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:483)
    org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:420)
技术使用:

  • Java-8
  • 嵌入式tomcat-8
  • 泽西岛2.5.1(其余)
  • JDBI 2.63.1(数据库服务)

Main.java

package com.example;

import com.core.db.DAOService;
import com.example.servlets.HelloWorldServlet;
import com.example.util.abc;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.skife.jdbi.v2.DBI;

public class Main {

public static void main (String[] args) {
    Tomcat tomcat = new Tomcat();
    tomcat.setPort(9000);

    String baseDoc = new File("src/main/webapp").getAbsolutePath();
    Context ctx = tomcat.addContext("/servletSample", baseDoc);

    tomcat.addWebapp(null, "", baseDoc);
    tomcat.addServlet(ctx, "HelloWorld", new HelloWorldServlet());
    ctx.addServletMapping("/*", "HelloWorld");

    try { 

        final DBI XYZDBI = new DBI(/*url*/, /*username*/, /*password*/);
        /* DAOService is a class that has function getDetails() that retrive   data from database */
        final DAOService daoService = XYZDBI.onDemand(DAOService.class);
        final org.glassfish.jersey.server.ResourceConfig jerseyResource = new org.glassfish.jersey.server.ResourceConfig();

        /* Register XYZResource class instance with jersey Resouce */
        jerseyResource.register(new XYZResource(daoService));

        tomcat.start();
        } catch (LifecycleException e) {
            e.printStackTrace();
        }

        while (true) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
package com.example;

import org.apache.catalina.Context;
import org.apache.catalina.servlets.DefaultServlet;
import org.apache.catalina.startup.Tomcat;
import org.apache.tomcat.util.descriptor.web.FilterDef;
import org.apache.tomcat.util.descriptor.web.FilterMap;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.mvc.jsp.JspMvcFeature;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.ServletProperties;

import javax.servlet.Filter;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import java.io.File;

/**
 * @author Paul Samsotha.
 */
public class Main {

    public static void main(String... args) throws Exception {
        Tomcat tomcat = new Tomcat();
        tomcat.setPort(9000);

        File base = new File(".");
        Context context = tomcat.addContext("", base.getAbsolutePath());

        Tomcat.addServlet(context, "default", new DefaultServlet());
        context.addServletMapping("/*", "default");

        final FilterDef def = new FilterDef();
        final FilterMap map = new FilterMap();

        def.setFilterName("jerseyFilter");
        def.setFilter(getJerseyFilter());
        context.addFilterDef(def);

        map.setFilterName("jerseyFilter");
        map.addURLPattern("/api/*");
        context.addFilterMap(map);

        tomcat.start();

        while (true) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private static Filter getJerseyFilter() {
        final ResourceConfig config = new ResourceConfig()
                .register(new HelloResource(new Service()))
                .register(JspMvcFeature.class)
                .property(ServletProperties.FILTER_FORWARD_ON_404, true);
        return new ServletContainer(config);
    }

    public static class Service {
        public String getMessage() {
            return "Hello Tomcat!";
        }
    }

    @Path("tomcat")
    public static class HelloResource {
        private final Service service;

        public HelloResource (Service service) {
            this.service = service;
        }

        @GET
        public String get() {
            return this.service.getMessage();
        }
    }
}

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.example</groupId>
<artifactId>my-jersey</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<build>
    <finalName>my-embed-tomcat</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.5.1</version>
            <inherited>true</inherited>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
   <!-- Dependencies for Jersey Web Application -->
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet-api</artifactId>
        <version>7.0.42</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-mvc-jsp</artifactId>
        <version>2.5.1</version>
    </dependency>

   <!-- Dependencies for Embedded Tomcat -->
   <dependency>
       <groupId>org.apache.tomcat.embed</groupId>
       <artifactId>tomcat-embed-core</artifactId>
       <version>8.0.26</version>
   </dependency>
   <dependency>
       <groupId>org.apache.tomcat.embed</groupId>
       <artifactId>tomcat-embed-logging-juli</artifactId>
       <version>8.0.26</version>
   </dependency>
   <dependency>
       <groupId>org.apache.tomcat.embed</groupId>
       <artifactId>tomcat-embed-jasper</artifactId>
       <version>8.0.26</version>
   </dependency>

   <dependency>
       <!--org.skife.jdbi.v2-->
       <groupId>org.jdbi</groupId>
       <artifactId>jdbi</artifactId>
       <version>2.63.1</version>
   </dependency>
   <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
       <version>1.7.7</version>
   </dependency>

   <dependency>
       <groupId>com.fasterxml.jackson.dataformat</groupId>
       <artifactId>jackson-dataformat-yaml</artifactId>
       <version>2.8.0.rc2</version>
   </dependency>
   <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
       <version>2.8.3</version>
   </dependency>
   <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-core</artifactId>
       <version>2.8.0.rc2</version>
   </dependency>
   <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-annotations</artifactId>
       <version>2.8.0.rc2</version>
   </dependency>
   <dependency>
       <groupId>microsoft.com</groupId>
       <artifactId>sqlJdbc4</artifactId>
       <version>4.0.2206.100</version>
   </dependency>
   <dependency>
       <groupId>commons-lang</groupId>
       <artifactId>commons-lang</artifactId>
       <version>2.6</version>
   </dependency>
</dependencies>
<?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.example</groupId>
    <artifactId>jersey-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <build>
        <finalName>my-embed-tomcat</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <inherited>true</inherited>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <properties>
        <tomcat.version>8.0.28</tomcat.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


   <dependencies>
s
       <dependency>
           <groupId>org.glassfish.jersey.bundles.repackaged</groupId>
           <artifactId>jersey-guava</artifactId>
           <version>2.25.1</version>
       </dependency>

       <!-- Dependencies for Jersey Web Application -->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>${tomcat.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.ext</groupId>
            <artifactId>jersey-mvc-jsp</artifactId>
            <version>2.5.1</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
       <dependency>
           <groupId>org.glassfish.jersey.containers</groupId>
           <artifactId>jersey-container-servlet</artifactId>
           <version>2.5.1</version>
       </dependency>
       <!-- Dependencies for Embedded Tomcat -->
       <dependency>
           <groupId>org.apache.tomcat.embed</groupId>
           <artifactId>tomcat-embed-core</artifactId>
           <version>${tomcat.version}</version>
       </dependency>
       <dependency>
           <groupId>org.apache.tomcat.embed</groupId>
           <artifactId>tomcat-embed-logging-juli</artifactId>
           <version>${tomcat.version}</version>
       </dependency>
       <dependency>
           <groupId>org.apache.tomcat.embed</groupId>
           <artifactId>tomcat-embed-jasper</artifactId>
           <version>${tomcat.version}</version>
       </dependency>

       <dependency>
           <!--org.skife.jdbi.v2-->
           <groupId>org.jdbi</groupId>
           <artifactId>jdbi</artifactId>
           <version>2.63.1</version>
       </dependency>
       <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-api</artifactId>
           <version>1.7.7</version>
       </dependency>

       <dependency>
           <groupId>com.fasterxml.jackson.dataformat</groupId>
           <artifactId>jackson-dataformat-yaml</artifactId>
           <version>2.8.0.rc2</version>
       </dependency>
       <dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-databind</artifactId>
           <version>2.8.3</version>
       </dependency>
       <dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-core</artifactId>
           <version>2.8.0.rc2</version>
       </dependency>
       <dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-annotations</artifactId>
           <version>2.8.0.rc2</version>
       </dependency>
       <dependency>
           <groupId>microsoft.com</groupId>
           <artifactId>sqlJdbc4</artifactId>
           <version>4.0.2206.100</version>
       </dependency>
       <dependency>
           <groupId>commons-lang</groupId>
           <artifactId>commons-lang</artifactId>
           <version>2.6</version>
       </dependency>
    </dependencies>

</project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>Jersey Jersey Application</display-name>

    <filter>
        <filter-name>Jersey Application Filter</filter-name>
        <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.example.MyApplication</param-value>
        </init-param>
        <!-- pass to next filter if Jersey/App returns 404 -->
        <init-param>
            <param-name>jersey.config.servlet.filter.forwardOn404</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>Jersey Application Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

你似乎有很多不必要的事情要做。您有两种不同的配置。挑一个。问题是由包扫描引起的,该扫描正在提取资源并尝试注册它

只需去掉web.xml和
MyApplication
,只需使用您当前在主类中使用的
ResourceConfig
。然后,您可以使用Jersey的程序注册servlet,Jersey的程序既是
过滤器
又是
HttpServlet
。因此,您不需要web.xml将Jersey配置为
过滤器
ServletContainer
已经是一个
过滤器

new SevletContainer(youResourceConfig);
我对Tomcat embedded不太熟悉,所以我不能说如何注册过滤器,但我相信快速搜索会找到答案。只需将
ServletContainer
注册为过滤器

jersey.config.servlet.filter.forwardOn404
init参数也可以配置过滤器注册。或者您可以使用
ResourceConfig
及其
属性
方法对其进行配置

resourceConfig.property("jersey.config.servlet.filter.forwardOn404", true);
或者更好的是,使用

更新 下面是一个完整的设置(基于您的示例),可以正常工作

import org.apache.catalina.Context;
import org.apache.catalina.servlets.DefaultServlet;
import org.apache.catalina.startup.Tomcat;
import org.apache.tomcat.util.descriptor.web.FilterDef;
import org.apache.tomcat.util.descriptor.web.FilterMap;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.mvc.jsp.JspMvcFeature;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.ServletProperties;

import javax.servlet.Filter;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import java.io.File;

/**
 * @author Paul Samsotha.
 */
public class Main {

    public static void main(String... args) throws Exception {
        Tomcat tomcat = new Tomcat();
        tomcat.setPort(9000);

        File base = new File(".");
        Context context = tomcat.addContext("", base.getAbsolutePath());

        Tomcat.addServlet(context, "default", new DefaultServlet());
        context.addServletMapping("/*", "default");

        final FilterDef def = new FilterDef();
        final FilterMap map = new FilterMap();

        def.setFilterName("jerseyFilter");
        def.setFilter(getJerseyFilter());
        context.addFilterDef(def);

        map.setFilterName("jerseyFilter");
        map.addURLPattern("/api/*");
        context.addFilterMap(map);

        tomcat.start();

        while (true) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private static Filter getJerseyFilter() {
        final ResourceConfig config = new ResourceConfig()
                .register(new HelloResource(new Service()))
                .register(JspMvcFeature.class)
                .property(ServletProperties.FILTER_FORWARD_ON_404, true);
        return new ServletContainer(config);
    }

    public static class Service {
        public String getMessage() {
            return "Hello Tomcat!";
        }
    }

    @Path("tomcat")
    public static class HelloResource {
        private final Service service;

        public HelloResource (Service service) {
            this.service = service;
        }

        @GET
        public String get() {
            return this.service.getMessage();
        }
    }
}
我做了一些改变:

  • 不确定为什么要使用Tomcat7ServletAPI。我将其更改为其他Tomcat依赖项的8.x版本

  • 我还从Jersey MVC依赖项中排除了Servlet API,因为它引入了旧的2.4 Servlet API

    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-mvc-jsp</artifactId>
        <exclusions>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    首先,感谢谁解决了我的问题。我在网上搜索,但没有找到确切的答案

    为了更好地参考和理解,我在GitHub上创建了一个演示应用程序

    使用的应用程序

    • TomcatV8.x
    • 泽西岛v2.5.1
    • JSP
    • YML
    • 自由标记
    • HTML/Angular/JavaScript

    谢谢你的回答。我是java新手。我正在按照你的建议尝试,但仍然不起作用。我创建了一个存储库。请检查代码感谢您的更新,它似乎非常类似于我的要求。我用了你最新的例子。当我运行它时,它会提示一个错误
    java.lang.NoClassDefFoundError:jersey/repackaged/com/google/common/base/Predicate,位于org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)
    我搜索此错误,发现了一个依赖项要求,如
    org.glassfish.jersey.bundles.repackated jersey guava 2.25.1
    我再次遇到新错误。您需要使用相同的jersey版本作为您的jersey依赖项。在你的帖子里,球衣MVC是2.5.1。这与您上述评论中的版本冲突。您最好使用较新的版本。是的,我已解决此错误。我更新了我的代码。但当我点击localhost:9000/api/tomcat时,它给出了404
    property(ServletProperties.FILTER_FORWARD_ON_404, true);
    
    import org.apache.catalina.Context;
    import org.apache.catalina.servlets.DefaultServlet;
    import org.apache.catalina.startup.Tomcat;
    import org.apache.tomcat.util.descriptor.web.FilterDef;
    import org.apache.tomcat.util.descriptor.web.FilterMap;
    import org.glassfish.jersey.server.ResourceConfig;
    import org.glassfish.jersey.server.mvc.jsp.JspMvcFeature;
    import org.glassfish.jersey.servlet.ServletContainer;
    import org.glassfish.jersey.servlet.ServletProperties;
    
    import javax.servlet.Filter;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import java.io.File;
    
    /**
     * @author Paul Samsotha.
     */
    public class Main {
    
        public static void main(String... args) throws Exception {
            Tomcat tomcat = new Tomcat();
            tomcat.setPort(9000);
    
            File base = new File(".");
            Context context = tomcat.addContext("", base.getAbsolutePath());
    
            Tomcat.addServlet(context, "default", new DefaultServlet());
            context.addServletMapping("/*", "default");
    
            final FilterDef def = new FilterDef();
            final FilterMap map = new FilterMap();
    
            def.setFilterName("jerseyFilter");
            def.setFilter(getJerseyFilter());
            context.addFilterDef(def);
    
            map.setFilterName("jerseyFilter");
            map.addURLPattern("/api/*");
            context.addFilterMap(map);
    
            tomcat.start();
    
            while (true) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        private static Filter getJerseyFilter() {
            final ResourceConfig config = new ResourceConfig()
                    .register(new HelloResource(new Service()))
                    .register(JspMvcFeature.class)
                    .property(ServletProperties.FILTER_FORWARD_ON_404, true);
            return new ServletContainer(config);
        }
    
        public static class Service {
            public String getMessage() {
                return "Hello Tomcat!";
            }
        }
    
        @Path("tomcat")
        public static class HelloResource {
            private final Service service;
    
            public HelloResource (Service service) {
                this.service = service;
            }
    
            @GET
            public String get() {
                return this.service.getMessage();
            }
        }
    }
    
    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-mvc-jsp</artifactId>
        <exclusions>
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    http://localhost:9000/api/tomcat
    
    final ResourceConfig config = new ResourceConfig()
        .packages(Main.class.getPackage().getName())
        .register(new Resource(new Core(), configuration)) // create instance of Resource and dynamically register
        .register(JspMvcFeature.class) // register jspMVC
        .register(FreemarkerMvcFeature.class) // register FreemarkerMVC
        .property(ServletProperties.FILTER_FORWARD_ON_404, true);
    
    return new ServletContainer(config);