当前位置: 首页 > 知识库问答 >
问题:

带有嵌入式Tomcat的RestEasy不扫描控制器

桑博远
2023-03-14
public class Main {

public static void main(String[] args) throws Exception {
    try {
        new Main().run();
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

    public void run() throws Exception {
        Tomcat tomcat = new Tomcat();
        tomcat.setPort(8080);

        Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath());
        String contextPath = "/";
        String appBase = ".";
        tomcat.getHost().setAppBase(appBase);
        tomcat.addWebapp(contextPath, appBase);

        Tomcat.addServlet(ctx, "rest-easy-servlet", new HttpServletDispatcher());
        ctx.addServletMapping("/*", "rest-easy-servlet");
        tomcat.start();
        tomcat.getServer().await();
    }
}

2017年11月9日下午2:21:22 org.apache.coyote.abstractProtocol start Info:Starting ProtocolHandler[“http-nio-8080”]2017年11月9日下午2:21:30 org.jboss.resteasy.core.exceptionHandler严重:未能执行javax.ws.rs.NotFoundException:找不到完整路径的资源:http://localhost:8080/users/hello at org.jboss.resteasy.core.registry.classnode.match(classnode.java:73)at GetResourceInvoker(resourceMethodRegistry.java:444)在org.jboss.resteasy.core.synchronousdispatcher.java:234)在org.jboss.resteasy.core.synchronousdispatcher.invoke(synchronousdispatcher.java:171)在org.jboss.resteasy.core.synchronousdispatcher.invoke(synchronousdispatcher.java:171)在.servlet.httpServletDispatcher.Service(httpServletDispatcher.java:51)(httpServlet.java:790)(httpServlet.java:790)(httpServlet.java.calatina.core.applicationFilterChain.internaldoFilter(applicationFilterChain.java:291)(applicationFilterChain.java:206)(applicationFilterChain.java:206)(applicationFilterChain.java.standardWrapperValve.invoke(standardWr106)在org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:502)在org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:142)在org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.invoke(errorreportvalve.java:79)在ACTHTP11处理器。java:1091)在org.apache.coyote.abstractProtocol$abstractConnectionHandler.process(abstractProtocol.java:673)在org.apache.tomcat.util.net.nioEndpoint$socketProcessor.dorun(nioEndpoint.java:1500)在org.apache.tomcat.util.net.nioEndpoint$socketProcessor.run(nioEndpoint.java:1456)在taskthread$wrappingrunnable.run(taskthread.java:61)at java.lang.thread.run(thread.java:745)

我想RestEasy没有任何信号来扫描它的组件。请帮助我扫描RestEasy组件的方法,或者使用web.xml注册RestEasy的方法

共有1个答案

欧阳德运
2023-03-14

使用嵌入式Tomcat时不会自动扫描资源和提供程序。您必须使用逗号分隔的值在应用程序子类或resteasy.resources上下文参数中手动注册它们。

首先,确保您在项目中具有以下依赖关系:

<properties>
    <tomcat.version>8.5.23</tomcat.version>
    <resteasy.version>3.1.4.Final</resteasy.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>${resteasy.version}</version>
    </dependency>
</dependencies>

创建一个JAX-RS资源类:

@Path("hello")
public class HelloWorldResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Response helloWorld() {
        return Response.ok("Hello World!").build();
    }
}
public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        return Collections.singleton(HelloWorldResource.class);
    }
}
public class Launcher {

    private static final String RESTEASY_SERVLET_NAME = "resteasy-servlet";

    public static void main(String[] args) throws Exception {
        new Launcher().start();
    }

    void start() throws Exception {

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

        String contextPath = "/api";
        String appBase = ".";

        Tomcat tomcat = new Tomcat();
        tomcat.setPort(Integer.valueOf(port));
        tomcat.getHost().setAppBase(appBase);

        Context context = tomcat.addContext(contextPath, appBase);
        context.addApplicationListener(ResteasyBootstrap.class.getName());
        Tomcat.addServlet(context, RESTEASY_SERVLET_NAME, new HttpServletDispatcher());
        context.addParameter("javax.ws.rs.Application", MyApplication.class.getName());
        context.addServletMappingDecoded("/*", RESTEASY_SERVLET_NAME);

        tomcat.start();
        tomcat.getServer().await();
    }
}
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <configuration>
                <finalName>tomcat-embedded-example-${project.version}</finalName>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.example.Launcher</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  • 打开命令行窗口或终端。
  • 导航到pom.xml所在的项目根目录。
  • 编译项目:MVN clean compile.
  • 打包应用程序:MVN package.
  • 在目标目录中查找。您应该看到一个具有以下名称或类似名称的文件:tomcat-embedded-sample-1.0-snapshot.jar.
  • 更改为目标目录。
  • 执行jar:java-jar tomcat-embedded-example-1.0-snapshot.jar.
  • 该应用程序可在http://localhost:8080/api/hello.
  • 获得

查看更多:

  • 嵌入Tomcat的泽西
  • 带有嵌入式码头的运动衫
 类似资料:
  • 我将Tomcat 7.0.32嵌入到一个水槽源代码中。我遇到的问题是Flume在类路径上放置了大量的东西,在启动时,Tomcat会扫描类路径寻找TLD,这是因为Flume使用通配符而导致的问题。 信息:启动Servlet引擎:Apache Tomcat/7.0.32 Nov.052012 8:21:08 AM org.Apache.catalina.startup.tldconfig tldSca

  • null ServerEndpoint: 谢谢你。

  • 我在日志中收到一些警告,像这样: 在一个独立的tomcat中,我可以创建一个: 如何禁用清单文件的JarScanner(https://tomcat.apache.org/tomcat-8.0-doc/config/jar-scanner.html)在使用Spring Boot的java配置类中。

  • 然而,有一个名为resteasy.scan的配置开关,对其进行了描述: “自动扫描WEB-INF/lib jar和WEB-INF/classes目录,查找@provider和JAX-RS资源类(@path、@get、@post等)并注册它们” ...所以,如果我想自动扫描我的资源,而不需要在web.xml中列出它们,或者必须手动将它们的类添加到扩展Application的类中的单例列表中...我应

  • 我试图让Spring Boot中的嵌入式Tomcat记录到我的Log4J2配置中,但它不起作用。 根据这个与外部Tomcat打交道的答案:https://stackoverflow.com/a/28639068/1845463似乎有必要将一些罐子移到$Catalina_home/libs等。我认为这在Spring Boot中是不可能的,不是吗? 有人设法让log4j2运行,并能够为catalina

  • 我想了解一些关于Spring的东西。我正在尝试配置它,但是有些东西我不明白,因为Spring似乎不认识我的控制器。 这是我的web.xml 这就是servlet 控制器: