我应该是一个非常简单的" Hello World" servlet,但我无法让它工作。我使用的是Eclipse,Tomcat 8,Java 7和Servlet 3.1。
我看过许多教程和问题,但他们并没有完全帮助。我见过的大多数教程都是通过扩展HttpServlet来讨论创建servlet的。我让那些人上班。现在我想尝试更清晰的注释方法。
我一直在指这个教程,但它并不完整,似乎有一些不正确或不完整的例子: Packaging and Deploying RESTful Web Services
为什么没有加载com.testing.service.MyApplication?
任何有关让这个东西运行的帮助都会非常感激!
以下是我的文件:
MyApplication.java
package com.testing.service;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("app")
public class MyApplication extends Application {
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(HelloWorldResource.class);
return s;
}
}
HelloWorldResource.java
package com.testing.service;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/helloworld")
public class HelloWorldResource {
@SuppressWarnings("unused")
private static final long serialVersionUID = 1L;
@GET
@Produces("text/plain")
public String sayHello() {
return "Hello World!";
}
}
的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>service</display-name>
<servlet>
<servlet-name>com.testing.service.MyApplication</servlet-name>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.testing.service.MyApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
的pom.xml
<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.testing</groupId>
<artifactId>service</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name>Rest Test</name>
<dependencies>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
每当我运行Tomcat时,它都会显示以下错误:
INFO: Marking servlet com.testing.service.MyApplication as unavailable
Feb 05, 2015 3:28:55 PM org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet /service threw load() exception
javax.servlet.ServletException: No servlet class has been specified for servlet com.testing.service.MyApplication
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1099)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1041)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4944)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
答案 0 :(得分:4)
我在相关问题的评论中找到了答案。答案由Alvin Thompson提供。不幸的是,我没有足够的声誉来对你的答案进行投票。
如果您使用的是标准Tomcat安装(或其他一些servlet) 容器),您需要包含自Tomcat以来的REST实现 没有一个。如果您正在使用Maven,请将其添加到 依赖部分:
<dependencies> <dependency> <groupId>org.glassfish.jersey.bundles</groupId> <artifactId>jaxrs-ri</artifactId> <version>2.13</version> </dependency> ... </dependencies>
然后只需将一个应用程序配置类添加到您的项目中。如果你 除了设置之外没有任何特殊的配置需求 其余服务的上下文路径,该类可以为空。一旦这个 添加了类,您不需要在web.xml中配置任何内容(或 有一个)。
最初发布在这里:
How to set up JAX-RS Application using annotations only (no web.xml)?
答案 1 :(得分:3)
您需要在web.xml文件中指定<servlet-class>
标记。
更改您的web.xml以指定以下内容:
替换
<servlet-name>com.testing.service.MyApplication</servlet-name>
使用
<servlet-name>MyApplication</servlet-name>
<servlet-class>com.testing.service.MyApplication</servlet-class>