【问题标题】:Jersey Grizzly REST service not visible outside localhostJersey Grizzly REST 服务在本地主机之外不可见
【发布时间】:2012-08-22 16:40:30
【问题描述】:

我正在尝试使用 Jersey 和 Glassfish Grizzly 在 Java 中编写 REST 服务。我有一个非常简单的案例在内部工作,但似乎无法从外部地址调用服务器。我尝试使用具有外部可见 IP 的各种不同机器对,并尝试在服务器中指定实际 IP 地址而不是 localhost,但没有任何效果。我有点松散地遵循官方用户指南here。我的资源:

package resources;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/simpleREST")
public class SimpleRESTResource
{
    @GET
    @Produces("text/plain")
    public String getMessage()
    {
        return "Message from server\n";
    }
}

还有服务器:

import java.io.IOException;
import java.net.URI;

import javax.ws.rs.core.UriBuilder;

import org.glassfish.grizzly.http.server.HttpServer;

import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;


public class Main
{
    public static final URI BASE_URI = UriBuilder.fromUri("http://localhost").port(9998).build();

    public static void main(String[] args) throws IOException
    {
        System.out.println("Starting grizzly...");
        ResourceConfig rc = new PackagesResourceConfig("resources");
        HttpServer myServer = GrizzlyServerFactory.createHttpServer(BASE_URI, rc);
        System.out.println(String.format("Jersey app started with WADL available at %s/application.wadl\n" +
                "Try out %s/simpleREST\nHit enter to stop it...", BASE_URI, BASE_URI));
        System.in.read();
        myServer.stop();
    }
}

在同一台机器上,我可以成功地与服务器交互使用

curl -X GET localhost:9998/simpleREST

curl -X GET [external numeric address]:9998/simpleREST

非常感谢您的任何建议。


解决方案

我已通过将服务器 URI 设置为 http://0.0.0.0:9998 而不是 localhost127.0.0.1 或实际地址来解决此问题。

【问题讨论】:

  • 什么是操作系统?你有防火墙在运行吗?
  • @Tom:在 OSX、Red Hat 和其他 linux 上试过,没有防火墙
  • 我也面临同样的问题。我已将 BASE_URI 更改为 0.0.0.0,但仍然无法正常工作
  • 您应该回答自己的问题,然后(2 天后)将其标记为已接受的答案。

标签: rest glassfish jersey ip-address jax-rs


【解决方案1】:

要使服务器 IP 地址在 localhost 之外可见,您必须首先打开必要的防火墙端口(如果有),或者使用“0.0.0.0”而不是“localhost”,以便服务器监听所有IP 地址和网络适配器。在您的本地网络中进行测试之前,请尝试从您的客户端设备 ping 您的服务器设备以检查是否存在实际连接或设备是否根本没有连接。

【讨论】:

  • 将 127.0.0.1 指定为要监听的 IP 地址,将使该套接字可以从 localhost 访问。
【解决方案2】:

使用 Jersey 和 Grizzly 2.30,它更简单:

final ResourceConfig rc = new ResourceConfig().packages("com.rest");

HttpServer httpServer = Grizzly

HttpServerFactory.createHttpServer(URI.create("http://0.0.0.0:9998/api/"), rc);

【讨论】:

    【解决方案3】:

    或者,您可以尝试以下代码:

        ResourceConfig rc = new PackagesResourceConfig("your-rest-packages");
        HttpHandler handler = ContainerFactory.createContainer(HttpHandler.class, rc);
        server = new HttpServer();
        server.getServerConfiguration().addHttpHandler(handler);
        //attach listeners
    
        InetAddress localHost = InetAddress.getLocalHost();
        String localHostAddr = localHost.getHostAddress();
        NetworkListener localHostListener = new NetworkListener("localhost", localHostAddr, port);
        server.addListener(localHostListener);
        InetAddress loopback = InetAddress.getLoopbackAddress();
        String loopbackAddr = loopback.getHostAddress();
        NetworkListener loopbackListener = new NetworkListener("loopback", loopbackAddr, port);
    

    现在您的服务器可以同时列出到本地主机和环回

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2011-07-25
      • 1970-01-01
      • 2020-07-12
      • 2022-01-16
      • 1970-01-01
      • 2013-11-15
      相关资源
      最近更新 更多