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的方法
使用嵌入式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
.java-jar tomcat-embedded-example-1.0-snapshot.jar
.http://localhost:8080/api/hello
.查看更多:
我将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 控制器: