WebService 项目 Java 在 Gradle 项目上

WebService Project Java on Gradle Project

我正在 Java 使用 NetBeans 并使用 gradle 作为依赖管理来开发 WebService。

我发现 this article 关于使用 gradle 开发网络项目。它使用 Gretty 插件。我按照说明进行操作(只是将 servlet 容器从 jetty 更改为 tomcat )并且可以 develop/deploy 一个 web 项目并从 servlet 打开 "home page" 。

问题是我的 WebService classes 没有正常工作。从我的浏览器发出的所有 GET 请求 returns 404 错误代码。为了进行测试,我使用 Netbeans 创建了一个新的 WebProject,但这次没有使用 Gradle,而且效果很好。

代码如下:

build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.akhikhl.gretty:gretty:+'
    }
}

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'org.akhikhl.gretty'

gretty {
    port = 8088
    contextPath = '/sisvendas'
    servletContainer = 'tomcat8'
}
repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.10'
    compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
    compile group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.0.1'

} 

资源:

@Path("produtos")
public class ProdutosResource {

    @Context
    private UriInfo context;

    public ProdutosResource() {
    }

    @GET
    @Produces("application/json")
    public String getJson() {
        // Just for testing...
        return "{\"produtos\":\"arroz\"}";
    }

    @PUT
    @Consumes("application/json")
    public void putJson(String content) {
    }
}

应用程序配置 class:

public class ApllicationConfig extends Application{

@Override
public Set<Class<?>> getClasses() {

    Set<Class<?>> resourcesSet = new java.util.HashSet<>();
    adicionarClassesRecursos( resourcesSet );
    return resourcesSet;

}

private void adicionarClassesRecursos( Set<Class<?>> resources ) {
    resources.add( com.gear.dev.webprojectgradle.resources.ProdutosResource.class );
}

}

这是 GET 的 url:http://localhost:8088/sisvendas/produtos

正如我之前所说,以下请求有效:http://localhost:8088/sisvendas/ (还有一个没用的index.html文件)

我做错了什么?

JAX-RS 只是一个规范。它需要 实现 才能发挥作用。您拥有 javax.ws.rs-api 的依赖项只是 规范 jar。没有实现,这意味着 运行 应用程序没有引擎。为 运行 JAX-RS 应用程序提供引擎的实现已经完成。

话虽如此,JAX-RS 规范是 Java EE 规范的一部分,因此如果您 运行 正在 Java EE 完全兼容的应用程序服务器中,像 Wildfly 或 Glassfish,那么该应用程序服务器将在内部已经具有 JAX-RS 实现,因此在应用程序项目级别,您只需要编译源代码的规范 jar,并且应用程序服务器将具有引擎 运行 运行 时间的申请。

但在您的情况下,Tomcat 不是 Java EE 兼容服务器。它只是一个 servlet 容器,实现了 servlet 规范。因此,如果您想将 JAX-RS 与 Tomcat 一起使用,您仍然需要 JAX-RS 实现 Jersey 就是这样一种实现。要使用 Jersey 实现,您实际上只需要以下依赖项

compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.23'
compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.23'

后面的依赖是添加JSON/POJO支持。您的代码中缺少的另一件事是 Application class

上的 @ApplicationPath 注释
@ApplicationPath("/")
public class ApllicationConfig extends Application {

@ApplicationPath 注释设置 Jersey 应用程序的 servlet 映射。如果您将其更改为 /api,那么您将访问的 URI 是

http://localhost:8080/sisvendas/api/produtos