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

时间:2018-07-21 22:37:10

标签: java gradle jersey glassfish jax-rs

我正在尝试使用Glassfish,Jersey和Gradle创建一个简单的Web应用程序。我已经达到了这样的程度: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.]]

1 个答案:

答案 0 :(得分:0)

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>

在学习泽西岛时,在搜索教程时,请记住,只要在任何地方看到com.sun.jersey时,它就是泽西岛1.x。 Jersey 2.x将采用org.glassfish.jersey包装。

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