WebSphere8.x和REST

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/

我正在努力让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/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;
        }
    }