【问题标题】:Endpoint Publish for REST Web ServicesREST Web 服务的端点发布
【发布时间】:2014-01-15 03:25:16
【问题描述】:

我在开发过程中使用 Endpoint.publish 发布了 JAX-WS Web 服务。是否存在任何此类实用程序类(在 JAX-RS 中)用于在球衣中发布 REST Web 服务?我参考了几篇文章,其中大部分是基于在某些容器(如 Jetty、Grizzly 等)中发布 Web 服务。

【问题讨论】:

    标签: web-services rest jax-ws jax-rs


    【解决方案1】:

    Jersey-Grizzly 有一个非常简单的解决方案。来自https://github.com/jesperfj/jax-rs-heroku

    package embedded.rest.server;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    import com.sun.grizzly.http.SelectorThread;
    import com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory;
    
    @Path("/hello")
    public class Main {
    
        public static void main(String[] args) {        
            final String baseUri = "http://localhost:7080/";
            final Map<String, String> initParams = new HashMap<String, String>();
    
            // Register the package that contains your javax.ws.rs-annotated beans here
            initParams.put("com.sun.jersey.config.property.packages","embedded.rest.server");
    
            System.out.println("Starting grizzly...");
            try {
                SelectorThread threadSelector =
                        GrizzlyWebContainerFactory.create(baseUri, initParams);
                System.out.println(String.format("Jersey started with WADL "
                        + "available at %sapplication.wadl.", baseUri));
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String hello() {
            return "Well, this was easy!";
        }
    }
    

    如果您使用的是 Maven,则需要以下三个依赖项:

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-grizzly</artifactId>
        <version>1.15</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-bundle</artifactId>
        <version>1.15</version>
    </dependency>
    <dependency>
        <groupId>com.sun.grizzly</groupId>
        <artifactId>grizzly-servlet-webserver</artifactId>
        <version>1.9.18-i</version>
    </dependency>
    

    要测试它,只需在浏览器中打开http://localhost:7080/hello

    【讨论】:

      【解决方案2】:

      我认为您可以使用Provider interface 来发布带有 JAX-WS 的 RESTful Web 服务。

      示例类:

      @WebServiceProvider
      @BindingType(value=HTTPBinding.HTTP_BINDING)
      public class AddNumbersImpl implements Provider {
      
          @Resource
          protected WebServiceContext wsContext;
      
          public Source invoke(Source source) {
              try {
                  MessageContext mc = wsContext.getMessageContext();
                  // check for a PATH_INFO request
                  String path = (String)mc.get(MessageContext.PATH_INFO);
                  if (path != null && path.contains("/num1") &&
                             path.contains("/num2")) {
                      return createResultSource(path);
                  }
                  String query = (String)mc.get(MessageContext.QUERY_STRING);
                  System.out.println("Query String = "+query);
                  ServletRequest req = (ServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
                  int num1 = Integer.parseInt(req.getParameter("num1"));
                  int num2 = Integer.parseInt(req.getParameter("num2"));
                  return createResultSource(num1+num2);
              } catch(Exception e) {
                  e.printStackTrace();
                  throw new HTTPException(500);
              }
          }
      
          private Source createResultSource(String str) {
              StringTokenizer st = new StringTokenizer(str, "=&/");
              String token = st.nextToken();
              int number1 = Integer.parseInt(st.nextToken());
              st.nextToken();
              int number2 = Integer.parseInt(st.nextToken());
              int sum = number1+number2;
              return createResultSource(sum);
          }
      
          private Source createResultSource(int sum) {
              String body =
                  "<ns:addNumbersResponse xmlns:ns="http://java.duke.org"><ns:return>"
                  +sum
                  +"</ns:return></ns:addNumbersResponse>";
              Source source = new StreamSource(
                  new ByteArrayInputStream(body.getBytes()));
              return source;
          }   
      }
      

      将我们的端点部署在使用 JAX-WS 运行的 servlet 容器上 RI 我们需要创建一个 WAR 文件。

      调整后的web.xml:

      <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
        <listener>
          <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener
        </listener>
        <servlet>
          <servlet-name>restful-addnumbers</servlet-name>
          <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet
          <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
          <servlet-name>restful-addnumbers</servlet-name>
          <url-pattern>/addnumbers/*</url-pattern>
        </servlet-mapping>
        <session-config>
          <session-timeout>60</session-timeout>
        </session-config>
      </web-app>
      

      并且需要将sun-jaxws.xml部署描述符添加到WAR文件中。

      <endpoints
          xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
          version="2.0">
      
          <endpoint
              name="restful-addnumbers"
              implementation="restful.server.AddNumbersImpl"
              wsdl="WEB-INF/wsdl/AddNumbers.wsdl"
              url-pattern="/addnumbers/*" />
      </endpoints>
      

      或者可以创建简单的 HttpServer

      import java.io.IOException;
      import com.sun.jersey.api.container.httpserver.HttpServerFactory;
      import com.sun.net.httpserver.HttpServer;
      
      public class YourREST {
      
          static final String BASE_URI = "http://localhost:9999/yourrest/";
      
          public static void main(String[] args) {
              try {
                  HttpServer server = HttpServerFactory.create(BASE_URI);
                  server.start();
                  System.out.println("Press Enter to stop the server. ");
                  System.in.read();
                  server.stop(0);
              } catch (IllegalArgumentException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
      

      【讨论】:

      • 我正在寻找一种替代方案,它允许我在不依赖 Web 容器的情况下部署 REST Web 服务。换句话说,一个可以从命令行界面发布 Web 服务的 API。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      相关资源
      最近更新 更多