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

标签 java gradle jersey glassfish jax-rs

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

我认为我应该访问的URL是localhost:8080 / expenditures / test,但是我也尝试过localhost:8080 / expenditures,localhost:8080 / test等,以进行健全性检查。

任何帮助将非常感激!

目录结构:

Photo here, can't embed images yet

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!";
  }
}

build.gradle(具有启动Glassfish服务器的任务)
apply plugin: 'java'
apply plugin: 'war'
apply plugin : 'idea'

sourceSets {
    main.java.srcDirs = ['src']
    // main.resources.srcDirs = ['src/resources']
}

repositories {
    mavenCentral()
}

dependencies {
    // https://mvnrepository.com/artifact/org.glassfish.jersey.containers/jersey-container-servlet-core
    compile group: 'org.glassfish.jersey.containers', name: 'jersey-container-servlet-core', version: '2.27'

    // https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson
    compile group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: '2.27'

    // https://mvnrepository.com/artifact/com.google.code.findbugs/jsr305
    compile group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'


}


//Trying to deploy to Glassfish...copied from
task run(dependsOn: 'war', type:Exec) {
    workingDir "dependencies/glassfish5/glassfish/bin"

    if (System.properties['os.name'].toLowerCase().contains('windows')) {
        commandLine 'cmd', '/c', 'asadmin.bat'
    } else {
        commandLine "./asadmin"
    }
    // args "stop-domain"
    args "deploy", "--force=true", "${war.archivePath}"
    // args "deploy", "${war.archivePath}"

}

我尝试通过运行进行部署:
./gradlew war && ./gradlew run

我在glassfish5 / glassfish / bin中也尝试了以下操作,结果相同:
./asadmin deploy --force=true /Users/Andrew/Documents/CodingProjects/expenditures/build/libs/expenditures.war 

Glassfish server.log结尾于:
[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+使用Jersey2.x。您拥有的web.xml配置适用于Jersey1.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>

在学习Jersey时,当您在搜索教程时,请记住,只要在任何地方看到com.sun.jersey,它就是Jersey1.x。 Jersey 2.x将被org.glassfish.jersey包装。

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

关于java - Glassfish/JAX-RS返回404,尽管取得了明显的成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51460640/

相关文章:

Java单例类与最终类

gradle - Gradle + TestKit + JaCoco:文件锁定异常

Gradle 存储库解析

Spring+Jersey 事务注解

java - 如何在特定 JAX - RS 调用上排除对象内的字段?

java - Jersey :找不到媒体类型=多部分/表单数据的 MessageBodyReader

java - 如何将 JwtFilter 异常传递给服务器 JSON 答案?

java - Controller 返回包含两个实体而不是一个实体的 JSON

java - 如何在 JOOQ 中传递参数(Null)和硬编码值

android - 具有 gradle 额外属性的自动增量版本代码