Gradle项目上的Web服务项目Java

Gradle项目上的Web服务项目Java,java,web-services,netbeans,gradle,gretty,Java,Web Services,Netbeans,Gradle,Gretty,我正在使用NetBeans和gradle开发一个Java Web服务作为依赖管理 我找到了与gradle一起开发web项目的方法。它使用Gretty插件。我按照说明(将servlet容器从jetty更改为tomcat)开发/部署一个web项目,并从servlet打开“主页” 问题是我的WebService类工作不正常。从我的浏览器发出的所有GET请求返回404错误代码。为了测试,我使用Netbeans创建了一个新的WebProject,但这次没有Gradle,它工作起来很有魅力 代码如下: 格雷

我正在使用NetBeans和gradle开发一个Java Web服务作为依赖管理

我找到了与gradle一起开发web项目的方法。它使用Gretty插件。我按照说明(将servlet容器从jetty更改为tomcat)开发/部署一个web项目,并从servlet打开“主页”

问题是我的WebService类工作不正常。从我的浏览器发出的所有GET请求返回404错误代码。为了测试,我使用Netbeans创建了一个新的WebProject,但这次没有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 );
}

}
public类应用程序配置扩展应用程序{
@凌驾
public Set>resourcesSet=new java.util.HashSet();
adicionarClassesRecursos(资源集);
返回资源集;
}
私人无效许可证(SetJAX-RS只是一个规范。它需要实现才能发挥任何作用。您拥有的
javax.ws.rsAPI
依赖项只是规范jar。没有实现,意味着没有引擎来运行应用程序。由实现来提供运行JAX-RS应用程序的引擎

也就是说,JAX-RS规范是JavaEE规范的一部分,因此,如果您运行在一个完全兼容JavaEE的应用服务器上,比如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
应用程序
类的注释

@ApplicationPath("/")
public class ApllicationConfig extends Application {
@ApplicationPath
注释设置Jersey应用程序的servlet映射。如果将其更改为
/api
,则将访问的URI为

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

谢谢@peeskillet它成功了!我想如果我想要一个空的应用程序路径,我可以删除这个注释。这就是我删除注释的原因。有不同的方法来配置应用程序部署。在不使用web.xml的情况下,发现应用程序的唯一方法是通过
@ApplicationPath
annot如果删除它,它将不会运行,因为不会发现应用程序,除非在web.xml中配置部署