1

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

我发现这篇关于使用 gradle 开发 Web 项目的文章。它使用 Gretty 插件。我按照说明操作(只是将 servlet 容器从 jetty 更改为 tomcat),可以开发/部署一个 Web 项目并从 servlet 打开“主页”。

问题是我的 WebService 类不能正常工作。从我的浏览器发出的所有 GET 请求都返回 404 错误代码。为了测试,我使用 Netbeans 制作了一个新的 WebProject,但这次没有 Gradle,它就像一个魅力。

下面是代码:

构建.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) {
    }
}

应用配置类:

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 的网址:http://localhost:8088/sisvendas/produtos

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

我做错了什么?

4

1 回答 1

1

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 容器。因此,如果您想在 Tomcat 中使用 JAX-RS,您仍然需要一个 JAX-RS实现。泽西岛就是这样一种实现。要使用 Jersey 实现,您实际上只需要以下依赖项

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

后一种依赖是添加 JSON/POJO 支持。您的代码中缺少的另一件事是您的课程@ApplicationPath上的注释Application

@ApplicationPath("/")
public class ApllicationConfig extends Application {

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

http://localhost:8080/sisvendas/api/produtos
于 2016-06-02T01:38:24.253 回答