Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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 Glassfish/JAX-RS返回404,尽管取得了明显的成功_Java_Gradle_Jersey_Glassfish_Jax Rs - Fatal编程技术网

Java Glassfish/JAX-RS返回404,尽管取得了明显的成功

Java Glassfish/JAX-RS返回404,尽管取得了明显的成功,java,gradle,jersey,glassfish,jax-rs,Java,Gradle,Jersey,Glassfish,Jax Rs,我正在尝试用Glassfish、Jersey和Gradle创建一个简单的Web应用程序。我已经到了一个地步,Glassfish的管理页面告诉我我已经成功部署,Glassfish日志说我的项目已经部署,但是所有带有“请求的资源不可用”的404请求。我花了好几个小时在线尝试/搜索信息,但我无法理解错误 我认为我应该访问的URL是localhost:8080/expensions/test,但我也尝试过localhost:8080/expensions、localhost:8080/test等,作为健

我正在尝试用Glassfish、Jersey和Gradle创建一个简单的Web应用程序。我已经到了一个地步,Glassfish的管理页面告诉我我已经成功部署,Glassfish日志说我的项目已经部署,但是所有带有“请求的资源不可用”的404请求。我花了好几个小时在线尝试/搜索信息,但我无法理解错误

我认为我应该访问的URL是localhost:8080/expensions/test,但我也尝试过localhost:8080/expensions、localhost:8080/test等,作为健全性检查

任何帮助都将不胜感激

目录结构:

<?xml version="1.0" encoding="UTF-8"?>
 <web-app>
<display-name>Expenditures</display-name>
<servlet>
    <servlet-name>Jersey</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.expenditures</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
package com.expenditures;

import javax.annotation.Nonnull;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/test")
public class ExpendituresServlet {

  @GET
  @Produces("text/plain")
  @Nonnull
  public String testHelloWorld() {
      return "Hello, world!";
  }
}
[2018-07-21T18:15:47.648-0400] [glassfish 5.0] [INFO] [AS-WEB-GLUE-00172] [javax.enterprise.web] [tid: _ThreadID=42 _ThreadName=admin-listener(1)] [timeMillis: 1532211347648] [levelValue: 800] [[
  Loading application [expenditures] at [/expenditures]]]

[2018-07-21T18:15:47.661-0400] [glassfish 5.0] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=42 _ThreadName=admin-listener(1)] [timeMillis: 1532211347661] [levelValue: 800] [[
  expenditures was successfully deployed in 521 milliseconds.]]

Web.xml:

<?xml version="1.0" encoding="UTF-8"?>
 <web-app>
<display-name>Expenditures</display-name>
<servlet>
    <servlet-name>Jersey</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.expenditures</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
package com.expenditures;

import javax.annotation.Nonnull;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/test")
public class ExpendituresServlet {

  @GET
  @Produces("text/plain")
  @Nonnull
  public String testHelloWorld() {
      return "Hello, world!";
  }
}
[2018-07-21T18:15:47.648-0400] [glassfish 5.0] [INFO] [AS-WEB-GLUE-00172] [javax.enterprise.web] [tid: _ThreadID=42 _ThreadName=admin-listener(1)] [timeMillis: 1532211347648] [levelValue: 800] [[
  Loading application [expenditures] at [/expenditures]]]

[2018-07-21T18:15:47.661-0400] [glassfish 5.0] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=42 _ThreadName=admin-listener(1)] [timeMillis: 1532211347661] [levelValue: 800] [[
  expenditures was successfully deployed in 521 milliseconds.]]
build.gradle(其任务是启动Glassfish服务器)

我尝试通过运行以下命令进行部署:

./gradlew war && ./gradlew run
我在glassfish 5/glassfish/bin中也尝试了以下方法,结果相同:

./asadmin deploy --force=true /Users/Andrew/Documents/CodingProjects/expenditures/build/libs/expenditures.war 
Glassfish server.log以:

<?xml version="1.0" encoding="UTF-8"?>
 <web-app>
<display-name>Expenditures</display-name>
<servlet>
    <servlet-name>Jersey</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.expenditures</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
package com.expenditures;

import javax.annotation.Nonnull;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/test")
public class ExpendituresServlet {

  @GET
  @Produces("text/plain")
  @Nonnull
  public String testHelloWorld() {
      return "Hello, world!";
  }
}
[2018-07-21T18:15:47.648-0400] [glassfish 5.0] [INFO] [AS-WEB-GLUE-00172] [javax.enterprise.web] [tid: _ThreadID=42 _ThreadName=admin-listener(1)] [timeMillis: 1532211347648] [levelValue: 800] [[
  Loading application [expenditures] at [/expenditures]]]

[2018-07-21T18:15:47.661-0400] [glassfish 5.0] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=42 _ThreadName=admin-listener(1)] [timeMillis: 1532211347661] [levelValue: 800] [[
  expenditures was successfully deployed in 521 milliseconds.]]

Glassfish 4+使用Jersey 2.x您的web.xml配置是针对Jersey 1.x的。对于2.x,配置将是

<servlet>
    <servlet-name>Jersey</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.expenditures</param-name>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

运动衫
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
com.com
1.
在您学习Jersey的过程中,当您搜索教程时,请记住,无论您在哪里看到
com.sun.Jersey
,这里都是Jersey 1.x。Jersey 2.x将是
org.glassfish.Jersey
包装


另外,由于您使用的是Glassfish,服务器上已经有了所有的Jersey罐子。为了避免将不兼容的JAR版本加倍,建议使用“提供的”作用域,这将导致构建系统仅使用JAR项目进行编译,而不会将其构建到要部署到服务器的最终工件中。
scope
的概念是为Maven设计的。我没有太多地使用Gradle,但我认为他们有一个类似的概念。当您在依赖项声明中使用
compile
时,我认为您还可以使用其他东西来获得“提供的”功能。你必须对此进行更多研究,因为我不确定它是什么。

太棒了,谢谢你的快速回复,保罗。如图所示,我已经更新了web.xml,但仍然得到了神秘的404。您还有其他问题吗?您能确认您的应用程序已部署到服务器吗?按照惯例,
web.xml
应该位于
src/main/webapp/web-INF/web.xml
中。这是Gradle和Maven中的标准web应用程序包。Java类应该位于
src/main/Java
中。你应该遵守这个惯例。我的直觉是,这个应用程序实际上还没有部署。尽管如此,上面的日志表明情况并非如此(正如->应用程序一样,它列出了“支出”)。你有没有别的办法来确认它是活的?我只是改变了我的目录结构,以匹配约定,但没有结果(感谢您的建议——请记住)。我不知道。我不使用Gradle或Glassfish。您可能想搜索一篇关于如何将Gradle应用程序部署到Glassfish的文章。