Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个简单的JAX-RS示例不起作用?_Java_Rest_Jakarta Ee_Jboss_Jax Rs - Fatal编程技术网

Java 为什么这个简单的JAX-RS示例不起作用?

Java 为什么这个简单的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

我正在尝试使用一个简单的JAX-RS示例,但没有成功

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>

游乐场
操场,休息
/原料药/*
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映射。”关键点,谢谢!