我使用NetBeans在Java中开发WebService并使用gradle作为依赖性管理。
我发现this article关于使用gradle开发Web项目。它使用Gretty插件。我按照说明操作(刚刚将servlet容器从jetty更改为tomcat)并可以开发/部署Web项目并打开"主页"来自servlet。
问题是我的WebService类无法正常工作。从我的浏览器发出的所有GET请求都返回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) {
}
}
应用程序配置类:
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文件)
我做错了什么?
答案 0 :(得分: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规范。因此,如果要将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支持。您的代码中缺少的另一件事是@ApplicationPath
类
Application
注释
@ApplicationPath("/")
public class ApllicationConfig extends Application {
@ApplicationPath
注释设置Jersey应用程序的servlet映射。如果您将其更改为/api
,则您要访问的URI是
http://localhost:8080/sisvendas/api/produtos