Java 为什么这个简单的JAX-RS示例不起作用?
我正在尝试使用一个简单的JAX-RS示例,但没有成功 web.xmlJava 为什么这个简单的JAX-RS示例不起作用?,java,rest,jakarta-ee,jboss,jax-rs,Java,Rest,Jakarta Ee,Jboss,Jax Rs,我正在尝试使用一个简单的JAX-RS示例,但没有成功 web.xml <servlet> <servlet-name>RestServlet</servlet-name> <servlet-class>javax.ws.rs.core.Application</servlet-class> </servlet> <servlet-mapping> <servlet-name>R
<servlet>
<servlet-name>RestServlet</servlet-name>
<servlet-class>javax.ws.rs.core.Application</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RestServlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RestServlet</servlet-name>
<servlet-class>playground.YourApplication</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RestServlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
游乐场
操场,休息
/原料药/*
java
package playground;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
public class Rest extends Application {
@GET
@Path("hello")
public String helloworld() {
return "Hello World!";
}
}
public class Rest {
@GET
@Path("hello")
public String helloworld() {
return "Hello World!";
}
}
访问http://localhost/{warcontext}/api/hello
和浏览器(GET)一起提供404错误状态
这可能是非常愚蠢的事情,但我不明白
使用:
JBoss EAP 6.1.0(Java EE 6)您需要扩展javax.ws.rs.core.Application(它可以保持为空)并用@ApplicationPath(“/ide”)注释它,然后创建一个JAX-rs资源,即一个带有@Path(“/hello”)注释的类。在这个类中,您只需要用@GET注释JAX-RS资源方法
@ApplicationPath("/ide")
public class Rest extends Application { }
@Path("/hello")
public class HelloResource {
@GET
@Path("hello")
public String helloworld() {
return "Hello World!";
}
}
您还可以看看这个示例:您需要在web.xml中声明servlet类(servlet名称不同):
游乐场休息服务
你的包,游乐场,休息
游乐场休息服务
/原料药/*
在servlet类中使用类的全名(包括包路径名)。web.xml
<servlet>
<servlet-name>RestServlet</servlet-name>
<servlet-class>javax.ws.rs.core.Application</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RestServlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RestServlet</servlet-name>
<servlet-class>playground.YourApplication</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RestServlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
如果需要,您可以添加 YourApplication.java
package playground;
import javax.ws.rs.core.Application;
...
public class YourApplication extends Application {
@Override
public Set<Class<?>> getClasses()
{
Set<Class<?>> yourResources = new HashSet<Class<?>>();
yourResources.add(InvoiceResource.class);
return yourResources;
}
}
package;
导入javax.ws.rs.core.Application;
...
公共类应用程序扩展了应用程序{
@凌驾
public Set>yoursources=new HashSet我也遇到了一些问题,因此我将为后代发布一个更完整的操作指南:
如果您使用的是标准的Tomcat安装(或其他servlet容器),如果您不能避免显式地告诉它在web.xml
文件*中启动哪些servlet。因为您必须使用web.xml
无论如何,让restful web服务工作的最简单方法是完全忘记扩展javax.ws.rs.core.Application
,只需在那里指定上下文路径。您仍然可以使用标准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>
在此之后,在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)
干杯
*如果您知道如何在Tomcat中将Jersey servlet添加到上下文中而不使用web.xml
——可能通过使用上下文或生命周期侦听器?资源不必在同一个类中,请告诉我,对吧..您错过了注释@ApplicationPath,所以..服务器不知道存在jax rs applica“如果您为应用程序添加@ApplicationPath(“/api”),那么web.xml不应该有servlet映射。”关键点,谢谢!