我正在尝试使用我在网上找到并部署到GlassFish 4.0的简单REST示例。我正在使用Eclipse(OEPE发行版)和GlassFish 4.0。当我尝试" Run As - >在Server"上运行REST示例似乎已部署,但我立即获得HTTP状态404 - 当Eclipse尝试联系我的上下文根(http://localhost:8080/RESTFullWS/
时,在Eclipse中找不到错误。)
根据我一直在阅读的内容,似乎所有内容都已到位,但我仍然无法从浏览器中查看上下文根或服务端点。我想我在这里遗漏了一些明显的东西,但不确定发生了什么。
服务:
package com.example.rest;
@Path("UserInfoService")
public class UserInfo
{
@GET
@Path("/name/{i}")
@Produces(MediaType.TEXT_XML)
public String userName(@PathParam("i") String i)
{
String name = i;
return "<User>" + "<Name>" + name + "</Name>" + "</User>";
}
@GET
@Path("/age/{j}")
@Produces(MediaType.TEXT_XML)
public String userAge(@PathParam("j") int j)
{
int age = j;
return "<User>" + "<Age>" + age + "</Age>" + "</User>";
}
}
在glassfish-web.xml中定义的Web上下文:
<glassfish-web-app>
<context-root>/RESTFullWS</context-root>
</glassfish-web-app>
http://localhost:8080/RESTFullWS/UserInfoService/name/bob -- gets me the 404.
我的服务是否正确部署?我该怎么测试?
答案 0 :(得分:6)
主要问题是你选择了一个用于Tomcat的教程,它只是一个servlet容器,而不是像 GlassFish 这样的完整Java EE应用服务器。
GlassFish 4 集成了 Jersey 2.x (这是提供REST内容的JAX-RS实现)。本教程建议使用 Jersey 1.x 并打包使用 Tomcat 所需的Jersey库,因为 Tomcat 没有附带必需的libs(其他Java EE技术也是如此,例如JPA,JSF等)。
但解决方案应该很简单。
正如您在评论中发表的那样,您没有web.xml
,这没关系,您的案例并不需要。
您需要一个代表REST应用程序的类并加载端点类。它看起来应该类似于:
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/rest")
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(UserInfo.class);
return classes;
}
}
如您所见,类UserInfo
已添加到类列表中。如果您创建了这样的附加端点类,请在此处添加。
注释javax.ws.rs.core.Application
设置REST端点的根,并在主context-root
之后添加。 URL应如下所示:
http://localhost:8080/RESTFullWS/rest/UserInfoService/name/bob
这应该足够了。从WEB-INF/lib
文件夹中删除所有库,因为GlassFish包含您的示例所需的所有内容。如果你需要一个用于导入的lib,它应该足以依赖javaee-api
包,你不需要将它与应用程序打包在一起。如果你使用Maven,你应该在pom.xml
:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
另见: