Java Glassfish/JAX-RS返回404,尽管取得了明显的成功
我正在尝试用Glassfish、Jersey和Gradle创建一个简单的Web应用程序。我已经到了一个地步,Glassfish的管理页面告诉我我已经成功部署,Glassfish日志说我的项目已经部署,但是所有带有“请求的资源不可用”的404请求。我花了好几个小时在线尝试/搜索信息,但我无法理解错误 我认为我应该访问的URL是localhost:8080/expensions/test,但我也尝试过localhost:8080/expensions、localhost:8080/test等,作为健全性检查 任何帮助都将不胜感激 目录结构: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等,作为健
<?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的文章。