2017-04-21 56 views
1

我遵循几个教程来设置一个非常简单的Jersey Webservice,这些对我来说都不是很清楚。无法获得简单的RS webservice与Eclipse一起工作Mars

有时候本教程正在讨论关于更改web.xml的问题,其他人说只需要在您的服务类中有某些注释。

所以我结束了以下结论:

使用新泽西2.x的你就不必做具体的事情在你的web.xml,才有球衣容器,把servlet.jar你的classpath和创建服务类,如下所示:

import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Application; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

@ApplicationPath("rest") 
public class RestService extends Application { 

    @GET 
    @Path("/sayhello") 
    @Produces(MediaType.TEXT_PLAIN) 
    public Response sayHello() { 
     return Response.ok("Hello World").build(); 
    } 

} 

这应该允许我使用访问API http://localhost:8080/EETest/rest/sayhello

我仔细检查了该项目已经部署,没有错误, Tomcat7服务器正在运行。所有的运动衫罐和依赖项都在我的lib文件夹中,并且已经添加到项目库中。修改后的index.html在拨打http://localhost:8080/EETest

时显示正常但Web服务没有响应(而是显示404页面)。

我知道它一定是非常基本的东西我在这里做错了...我用尽了选择。

编辑:这是我的web.xml对于什么是值得

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>EETest</display-name> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 
</web-app> 

回答

2

不知道你在哪里学会了做这个

@ApplicationPath("rest") 
public class RestService extends Application { 

    @GET 
    @Path("/sayhello") 
    @Produces(MediaType.TEXT_PLAIN) 
    public Response sayHello() { 
     return Response.ok("Hello World").build(); 
    } 
} 

但它是错的。在JAX-RS中,我们有资源类。资源类别应注明@Path,而不是@ApplicationPath。后者用于应用程序配置类。所以,你应该有类似

@ApplicationPath("/rest") 
public class AppConfig extends Application {} 

@Path("/") 
public class RestService { 
    @GET 
    @Path("/sayhello") 
    @Produces(MediaType.TEXT_PLAIN) 
    public Response sayHello() { 
     return Response.ok("Hello World").build(); 
    } 
} 

什么用@ApplicationPath确实空类是触发类路径扫描。因此,类路径将被扫描以注解@Path@Provider的类,并且这些类将被注册。

在此示例中,我使用了@Path("/"),以便您仍然可以使用相同的URL /rest/sayHello。但通常情况下,资源类将具有映射到集合URL的路径,如/rest/animals,因此您将在该类上使用@Path("animals"),并且可以使用该类中的方法添加子资源,该方法也用@Path进行了注释。任何未注明@Path但具有类似@GET的方法的方法都将映射到根资源路径/rest/animals

一些其他的东西。请记住,我提到了使用@ApplicationPath注释的空类Application类触发的类路径扫描。那么这是一种沮丧。你可以注册类中明确,而不是

@ApplicationPath("/rest") 
public class AppConfig extends Application { 
    @Override 
    public Set<Class<?>> getClasses() { 
     final Set<Class<?>> classes = new HashSet<>(); 
     classes.add(RestService.class); 
     return classes; 
    } 
} 

但是,当我们用球衣中,优选的使用泽西特定类(除非你有一个要求,以保持它的JAX-RS实现之间移植)。有了泽西岛,你可以使用它的ResourceConfig类(它是Application的子类)。你可以使用packages方法

@ApplicationPath("/rest") 
public class AppConfig extends ResourceConfig { 
    public AppConfig() { 
     packages("the.packages.to.scan"); 

     register(RestService.class); 
    } 
} 
+0

它的工作大有与register方法注册个人类,你可以触发包扫描(这是不一样的类路径扫描)。我对这些改变感到非常惊讶,因为我使用Jersey创建了一个Rest Webservice,但它是1.x我猜是因为我必须在web.xml中设置配置,并且没有“Application”或“ApplicationPath “涉及 – devnull69

相关问题