我正在尝试使用JAX-RS创建和部署一个RESTful Web服务,并将其部署到tomcat。我不想使用任何IDE。在Tomcat中,我在webapps中有以下目录结构\
notifire\WEB-INF\
|
---> web.xml
|
---> \classes/Notifier.class
|
---> \lib\javax.ws.rs-api-2.0
我的web.xml包含:
<servlet>
<servlet-name>Web Service Servlet</servlet-name>
<servlet-class>javax.ws.rs.core.Application</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Web Service Servlet</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
以及类文件通知程序。类
是从文件通知程序编译而来的。java。
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
@Path("notifier")
public class Notifier {
@Context
private UriInfo context;
@GET
@Produces("text/html")
public String getHTML() {
return "<p></p>";
}
}
当我试图访问Web服务在http://localhost:8080/notifire/webservice/notifier
我得到以下错误:
--类型异常报告
--消息类javax。ws。rs.core。应用程序不是Servlet
--说明服务器遇到内部错误,无法满足此请求。
感谢任何帮助。
我也很难让它正常工作。因为你必须使用web。xml
无论如何,让restful web服务工作的最简单方法就是忘记扩展javax。ws。rs.core。整个应用程序
,只需在其中指定上下文路径即可。您仍然可以使用标准的jax-rs注释来声明实际的web服务。
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
>
<servlet>
<servlet-name>rest-test</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.domain.mypackage</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name> rest-test</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
有两点值得注意:
>
您需要在WAR文件中捆绑一个REST实现,因为servlet容器通常不包含REST实现。因为Jersey是JAX-RS的参考实现,所以我在上面的servlet类
元素中使用了它。如果需要,可以用ApacheCXF实现来替换它。
init param
元素告诉Jersey哪些包需要搜索带有web服务注释的Java文件。编辑此链接以指向您的web服务。请注意,如果您选择使用ApacheCxf而不是Jersey,那么任何init param
元素中所需的内容都会有所不同。有人谁知道CXF请张贴他们将是什么。
如果您使用的是Maven,只需在pom的
文件:dependencies
部分向jersey servlet
添加一个依赖项即可。xml
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.18.2</version>
</dependency>
...
</dependencies>
之后,使用Java类中的标准JAX-RS注释直接声明Web服务:
package com.domain.mypackage;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.Path;
// It's good practice to include a version number in the path so you can have
// multiple versions deployed at once. That way consumers don't need to upgrade
// right away if things are working for them.
@Path("calc/1.0")
public class CalculatorV1_0 {
@GET
@Consumes("text/plain")
@Produces("text/plain")
@Path("addTwoNumbers")
public String add(@MatrixParam("firstNumber") int n1, @MatrixParam("secondNumber") int n2) {
return String.valueOf(n1 + n2);
}
}
这就是你所需要的。如果Tomcat安装在端口8080上本地运行,并且您将WAR文件部署到上下文myContext
,则转到
http://localhost:8080/myContext/rest/calc/1.0/addTwoNumbers;firstNumber=2;secondNumber=3
...应该产生预期的结果(5)。
干杯
*如果你知道一种不使用web将Jersey servlet添加到Tomcat上下文中的方法,请指正。xml
——可能通过使用上下文或生命周期侦听器?
您的Servlet有错误的类。不知道为什么您不想使用IDE,但是有一个maven原型可以使用泽西开发人员定义的适当类为您布局项目结构。我的web.xml如下:
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.pluralsight</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>
我在这门课程中介绍了所有这些。
16:24:10,350错误[org.jboss.as.server](DeploymentScanner-Threads-2)JBAS015870:部署“search-rest.war”的部署已回滚,并返回以下失败消息:{“JBAS014671:Failed Services”=>{“jboss.deployment.unit.\”search-rest.war\“.WeldStartServi
问题内容: 我正在尝试向一些Web服务调用中添加一些响应标头。我使用CXF 2.1.2和JAX- RS编写了Web服务。我需要返回一个对象,我还想向Response添加一些标头。 在不返回javax.ws.rs.core.Response对象的情况下 ,如何在响应中添加标头并仍然返回javabean? 问题答案: 您可以通过Web服务中的@Context注释注入对实际HttpServletResp
问题内容: 我正在尝试完成有关如何在Azure域/环境中正确使用Windows容器的架构研究,其中我必须将Dot Net Core Web API应用程序容器化并将该容器部署到Azure容器服务中 这是我做的事情 我确实在Azure门户中创建了Azure容器服务帐户/域/虚拟机 此外,我确实使用已安装Docker的容器为Windows Server 2016创建了另一个虚拟机 在Windows S
问题内容: JAX-RS 1.1规范在第6页上说: 如果不存在Application子类,则必须将添加的servlet命名为: 添加的servlet是什么?可以是任意servlet吗? 如果存在Application子类,并且已经定义了一个servlet,该servlet的servlet初始化参数为: 同样,这里的“ servlet”是什么? 如果存在不由现有Servlet处理的Applicati
问题内容: 我试图通过注释将无状态EJB注入到JAX-RS Web服务中。不幸的是,EJB是正义的,当我尝试使用它时我得到了。 我究竟做错了什么? 以下是有关我的机器的一些信息: Glassfish 3.1 Netbeans 6.9 RC 2 Java EE 6 你们能举个可行的例子吗? 问题答案: 我不确定这是否行得通。所以: 选项1:使用注入提供程序SPI 实现一个提供程序,它将执行查找并注入
问题内容: 我正在使用JAX-RS的Jersey实现。我想将JSON对象发布到该服务,但收到错误代码415不支持的媒体类型。我想念什么? 这是我的代码: 这是Order对象: 这样的GET请求可以完美地工作,并以JSON格式返回订单: 但是,像这样的POST请求返回415: 问题答案: 答案非常简单。我必须在请求中添加标头,其值为。没有此标头,Jersey不知道如何处理请求正文(尽管有注释)!