WebSphere8.x和REST
我正在努力让REST服务在WebSphere8.x中工作,但是当我使用以下web.xml时WebSphere8.x和REST,websphere,jax-rs,Websphere,Jax Rs,我正在努力让REST服务在WebSphere8.x中工作,但是当我使用以下web.xml时 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<display-name>jersey</display-name>
<servlet-name>jersey</servlet-name>
<servlet-class>
com.ibm.websphere.jaxrs.server.IBMRestServlet
</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>org.gleason.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
运动衫
运动衫
com.ibm.websphere.jaxrs.server.IBMRestServlet
com.sun.jersey.config.property.packages
org.gleason.rest
1.
运动衫
/休息/*
当我尝试启动应用程序时,我得到了一个404,eclipse也显示了以下构建错误
说明资源路径位置类型
servlet映射“jersey”指的是未定义的servlet。web.xml/restest/WebContent/web-INF未知web问题
这让我相信它没有正确构建,这就是为什么我的index.html可以工作,但JAX-RS失败的原因
有人能看到我遗漏了什么吗?所有的例子都是围绕应用程序展开的,我宁愿使用包。是基于ApacheWink的JAX-RS实现。您的配置显示了ApacheWink和Jersey的混合(另一个JAX-RS实现)。WAS有基于ApacheWink的JAX-RS实现。您的配置显示了ApacheWink和Jersey的混合(另一个JAX-RS实现)。下面是一个简单的示例,说明如何在WAS8中开发和部署REST服务。 该示例基于一个API来管理JSON配置,即列出、获取、上载等
package se.xyz;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
//Use the ApplicationPath annotation do specify the URI path to your REST API
@ApplicationPath("api")
public class RestAPIRegistrationServlet extends Application {
@Override
public Set<Object> getSingletons() {
Set<Object> tSet = new HashSet<Object>();
//add an instance of your API class to the set of API´s.
tSet.add(new ConfigRestAPI());
return tSet;
}
}
包se.xyz;
导入java.util.HashSet;
导入java.util.Set;
导入javax.ws.rs.ApplicationPath;
导入javax.ws.rs.core.Application;
//使用ApplicationPath注释指定RESTAPI的URI路径
@应用程序路径(“api”)
公共类RestAPIRegistrationServlet扩展了应用程序{
@凌驾
公共集getSingleton(){
Set tSet=newhashset();
//将API类的实例添加到API的集合中。
添加(新的ConfigRestAPI());
返回tSet;
}
}
下面是管理JSON配置的API注意API正在使用ConfigManager来处理配置。该类不包括在示例中
package se.xyz;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import org.apache.wink.common.model.wadl.WADLGenerator;
//Specify the ConfigRestAPI part of the URI path
@Path("/configs")
public class ConfigRestAPI{
private static Logger _LOGGER = Logger.getLogger(ConfigRestAPI.class.getName());
@javax.ws.rs.OPTIONS
@Produces("application/vnd.sun.wadl+xml")
public org.apache.wink.common.model.wadl.Application getOptions(@Context Application app,
@Context HttpServletRequest aHttpServletRequest) {
logAccess(aHttpServletRequest);
Set<Object> tObjectSet = app.getSingletons();
Set<Class<?>> tClassSet = new HashSet<Class<?>>();
for (Object tObject : tObjectSet) {
tClassSet.add(tObject.getClass());
}
org.apache.wink.common.model.wadl.Application wadlAppDoc = new WADLGenerator().generate("", tClassSet);
/* modify the wadlAppDoc JAXB model if you want to add additional information */
return wadlAppDoc;
}
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public Response list(@Context HttpServletRequest aHttpServletRequest) {
logAccess(aHttpServletRequest);
try {
ResponseBuilder tResponseBuilder =
Response.ok(ConfigManager.getInstance().fetchConfigs(), MediaType.APPLICATION_JSON);
Response tResponse = tResponseBuilder.build();
return tResponse;
} catch (Throwable e) {
_LOGGER.log(Level.SEVERE, e.getMessage(), e);
throw new WebApplicationException(e, Response.serverError()
.entity(e.getClass().getName() + ", Message: " + e.getMessage()).build());
}
}
private boolean isNullOrBlank(String aVal){
return aVal == null || "".equals(aVal.trim());
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response fetch(@QueryParam("id") String id, @Context HttpServletRequest aHttpServletRequest) {
logAccess(aHttpServletRequest);
try {
if (isNullOrBlank(id)) {
return Response.serverError().entity("id cannot be null or blank").build();
}
ResponseBuilder tResponseBuilder =
Response.ok(ConfigManager.getInstance().fetchConfig(id), MediaType.APPLICATION_JSON);
Response tResponse = tResponseBuilder.build();
return tResponse;
} catch (Throwable e) {
_LOGGER.log(Level.SEVERE, e.getMessage(), e);
throw new WebApplicationException(e, Response.serverError()
.entity(e.getClass().getName() + ", Message: " + e.getMessage()).build());
}
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public Response store(String aConfig, @QueryParam("id") String id, @Context HttpServletRequest aHttpServletRequest) {
logAccess(aHttpServletRequest);
try {
if (isNullOrBlank(id)) {
return Response.serverError().entity("id cannot be null or blank").build();
}
ConfigManager.getInstance().storeConfig(aConfig, id);
} catch (Throwable e) {
_LOGGER.log(Level.SEVERE, e.getMessage(), e);
throw new WebApplicationException(e, Response.serverError()
.entity(e.getClass().getName() + ", Message: " + e.getMessage()).build());
}
ResponseBuilder tResponseBuilder = Response.ok();
Response tResponse = tResponseBuilder.build();
return tResponse;
}
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public Response update(String aConfig, @QueryParam("id") String id, @Context HttpServletRequest aHttpServletRequest) {
logAccess(aHttpServletRequest);
try {
if (isNullOrBlank(id)) {
return Response.serverError().entity("id cannot be null or blank").build();
}
ConfigManager.getInstance().updateConfig(aConfig, id);
} catch (Throwable e) {
_LOGGER.log(Level.SEVERE, e.getMessage(), e);
throw new WebApplicationException(e, Response.serverError()
.entity(e.getClass().getName() + ", Message: " + e.getMessage()).build());
}
ResponseBuilder tResponseBuilder = Response.ok();
Response tResponse = tResponseBuilder.build();
return tResponse;
}
@DELETE
@Produces(MediaType.TEXT_PLAIN)
public Response delete(@QueryParam("id") String id, @Context HttpServletRequest aHttpServletRequest) {
logAccess(aHttpServletRequest);
try {
if (isNullOrBlank(id)) {
return Response.serverError().entity("id cannot be null or blank").build();
}
ConfigManager.getInstance().deleteConfig(id);
} catch (Throwable e) {
_LOGGER.log(Level.SEVERE, e.getMessage(), e);
throw new WebApplicationException(e, Response.serverError()
.entity(e.getClass().getName() + ", Message: " + e.getMessage()).build());
}
ResponseBuilder tResponseBuilder = Response.ok();
Response tResponse = tResponseBuilder.build();
return tResponse;
}
private static void logAccess(HttpServletRequest aHttpServletRequest) {
if (_LOGGER.isLoggable(Level.FINE))
_LOGGER.fine(aHttpServletRequest.getRequestURI() + " called from: " + aHttpServletRequest.getRemoteHost()
+ " (" + aHttpServletRequest.getRemoteAddr() + ")");
}
}
包se.xyz;
导入java.util.HashSet;
导入java.util.Set;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.servlet.http.HttpServletRequest;
导入javax.ws.rs.Consumes;
导入javax.ws.rs.DELETE;
导入javax.ws.rs.GET;
导入javax.ws.rs.POST;
导入javax.ws.rs.PUT;
导入javax.ws.rs.Path;
导入javax.ws.rs.products;
导入javax.ws.rs.QueryParam;
导入javax.ws.rs.WebApplicationException;
导入javax.ws.rs.core.Application;
导入javax.ws.rs.core.Context;
导入javax.ws.rs.core.MediaType;
导入javax.ws.rs.core.Response;
导入javax.ws.rs.core.Response.ResponseBuilder;
导入org.apache.wink.common.model.wadl.WADLGenerator;
//指定URI路径的ConfigRestAPI部分
@路径(“/configs”)
公共类ConfigRestAPI{
私有静态记录器_Logger=Logger.getLogger(ConfigRestAPI.class.getName());
@javax.ws.rs.OPTIONS
@生成(“application/vnd.sun.wadl+xml”)
public org.apache.wink.common.model.wadl.Application getOptions(@Context-Application-app,
@上下文HttpServletRequest(HttpServletRequest){
日志访问(aHttpServletRequest);
Set tObjectSet=app.getSingletons();
Set>();
for(对象tObject:tObjectSet){
tClassSet.add(tObject.getClass());
}
org.apache.wink.common.model.wadl.Application wadlapdc=new WADLGenerator().generate(“,tClassSet);
/*如果要添加其他信息,请修改WADLAPDOC JAXB模型*/
返回WADLAPDOC;
}
@得到
@路径(“/list”)
@产生(MediaType.APPLICATION_JSON)
公共响应列表(@Context-HttpServletRequest-ahttpsservletrequest){
日志访问(aHttpServletRequest);
试一试{
响应生成器TresponsBuilder=
Response.ok(ConfigManager.getInstance().fetchConfigs(),MediaType.APPLICATION_JSON);
Response tResponse=tResponseBuilder.build();
返回树响应;
}捕获(可丢弃的e){
_LOGGER.log(Level.SEVERE,e.getMessage(),e);
抛出新的WebApplicationException(e,Response.serverError()
.entity(e.getClass().getName()+”,消息:“+e.getMessage()).build());
}
}
私有布尔值isNullOrBlank(字符串aVal){
返回aVal==null | |“”.equals(aVal.trim());
}
@得到
@产生(MediaType.APPLICATION_JSON)
公共响应获取(@QueryParam(“id”)字符串id,@Context HttpServletRequest aHttpServletRequest){
日志访问(aHttpServletRequest);
试一试{
if(isNullOrBlank(id)){
返回Response.serverError().entity(“id不能为null或空白”).build();
}
响应生成器TresponsBuilder=
Response.ok(ConfigManager.getInstance().fetchConfig(id),MediaType.APPLICATION_JSON);
Response tResponse=tResponseBuilder.build();
返回树响应;
}捕获(可丢弃的e){
_LOGGER.log(Level.SEVERE,e.getMessage(),e);
抛出新的WebApplicationException(e,Response.serverError()
.entity(e.getClass().getName()+”,消息:“+e.getMessage()).build());
}
}
@职位
@使用(MediaType.APPLICATION_JSON)
@生成(MediaType.TEXT\u PLAIN)
公共响应存储(字符串aConfig、@QueryParam(“id”)字符串id、@Context-HttpServletRequest-ahttpsservletrequest){
日志访问(aHttpServletRequest);
试一试{
if(isNullOrBlank(id)){
返回Response.serverError().entity(“id不能为null或空白”).build();
}
ConfigManager.getInstance().storeConfig(aConfig,id);
}捕获(可丢弃的e){
_LOGGER.log(Level.SEVERE,e.getMessage(),e);
抛出新的WebApplicationException(e,Response.serverError()
.entity(e.getClass().getName()+),消息:“+e.getMessage()).build(
<featureManager>
<feature>jsp-2.2</feature>
<feature>localConnector-1.0</feature>
<!-- <feature>jaxrs-1.1</feature> -->
</featureManager>
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
@ApplicationPath("rest")
@Path("/service")
public class RestService extends Application {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Map hello() {
Map map = new HashMap(1);
map.put("Hello", "I'm a REST Service");
return map;
}
@POST //
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Map helloName(HashMap entryMap) {
Map map = new HashMap(1);
map.put("Hello", entryMap.get("Name"));
return map;
}
}