【问题标题】:Jersey Grizzly restful server throws a strange URISyntaxException on LinuxJersey Grizzly 宁静的服务器在 Linux 上抛出一个奇怪的 URISyntaxException
【发布时间】:2012-05-16 06:52:17
【问题描述】:

我创建了一个在 Win7 上运行良好的 Jersey-Grizzy-Server。但是在 Linux 上启动后,我会得到一个奇怪的、总是重复的异常

java.lang.IllegalArgumentException: java.net.URISyntaxException: Expected hostname at index 8: https://:443/

,即使没有调用服务器。休息服务一直在工作。有人知道为什么会出现这个异常,或者如何开始调试 grizzly2 Httpserver?

Server Start 是这样实现的(简化):

boolean https = true;
int port = 9960;
URI baseURI = UriBuilder.fromUri("http" + (https ? "s" : "") + "://0.0.0.0/").port(port).build();

//Jersey Service Config
final ResourceConfig rc = new UriExtensionsConfig(GcardApplication.getConfigPackages());

// create Grizzly Container
final HttpHandler handler = ContainerFactory.createContainer(HttpHandler.class, rc);

//do the ssl Config
SLEngineConfigurator ssl = configSSL(https);

HttpServer server = GrizzlyServerFactory.createHttpServer(baseURI, handler, https, ssl);

异常日志:

INFO: Initiating Jersey application, version 'Jersey: 1.11 12/09/2011 10:27 AM'
May 7, 2012 8:20:45 PM org.glassfish.grizzly.http.server.NetworkListener start
INFO: Started listener bound to [0.0.0.0:9960]
May 7, 2012 8:20:45 PM org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
Crm WS Server started at https://localhost:9960/

Hit Ctrl C to stop the server ...
May 7, 2012 8:20:46 PM org.glassfish.grizzly.http.server.HttpHandler doHandle
SEVERE: service exception
java.lang.IllegalArgumentException: java.net.URISyntaxException: Expected hostname at index 8: https://:443/
    at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer.getBaseUri(GrizzlyContainer.java:226)
    at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer._service(GrizzlyContainer.java:195)
    at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer.service(GrizzlyContainer.java:185)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:163)
    at org.glassfish.grizzly.http.server.HttpHandlerChain.service(HttpHandlerChain.java:195)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:163)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:158)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:286)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:223)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:155)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:134)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:78)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:827)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:103)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:111)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:131)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:508)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:488)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.net.URISyntaxException: Expected hostname at index 8: https://:443/
    at java.net.URI$Parser.fail(URI.java:2810)
    at java.net.URI$Parser.failExpecting(URI.java:2816)
    at java.net.URI$Parser.parseHostname(URI.java:3352)
    at java.net.URI$Parser.parseServer(URI.java:3198)
    at java.net.URI$Parser.parseAuthority(URI.java:3117)
    at java.net.URI$Parser.parseHierarchical(URI.java:3059)
    at java.net.URI$Parser.parse(URI.java:3015)
    at java.net.URI.<init>(URI.java:662)
    at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer.getBaseUri(GrizzlyContainer.java:223)
    ... 20 more
May 7, 2012 8:20:49 PM org.glassfish.grizzly.http.server.HttpHandler doHandle
SEVERE: service exception
java.lang.IllegalArgumentException: java.net.URISyntaxException: Expected hostname at index 8: https://:443/
    at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer.getBaseUri(GrizzlyContainer.java:226)
    at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer._service(GrizzlyContainer.java:195)
    at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer.service(GrizzlyContainer.java:185)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:163)
    at org.glassfish.grizzly.http.server.HttpHandlerChain.service(HttpHandlerChain.java:195)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:163)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:158)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:286)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:223)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:155)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:134)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:78)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:827)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:103)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:111)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:131)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:508)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:488)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.net.URISyntaxException: Expected hostname at index 8: https://:443/
    at java.net.URI$Parser.fail(URI.java:2810)
    at java.net.URI$Parser.failExpecting(URI.java:2816)
    at java.net.URI$Parser.parseHostname(URI.java:3352)
    at java.net.URI$Parser.parseServer(URI.java:3198)
    at java.net.URI$Parser.parseAuthority(URI.java:3117)
    at java.net.URI$Parser.parseHierarchical(URI.java:3059)
    at java.net.URI$Parser.parse(URI.java:3015)
    at java.net.URI.<init>(URI.java:662)
    at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer.getBaseUri(GrizzlyContainer.java:223)
    ... 

【问题讨论】:

  • 你是否在你的 Linux 发行版中配置了环回地址(可能是 /etc/hosts)?
  • 我们已经为 /etc/hosts 配置了 127.0.0.1 localhost
  • 可以让 Jersey Logger 工作。在那里我可以看到我的服务器被调用的位置。看起来反向代理正在调用端口:9960 而不是 443。

标签: java rest https glassfish jersey


【解决方案1】:

问题的根源是 ReversProxys Healthcheck 的配置,它具有以下发送字符串

GET / HTTP/1.1\r\nHost: \r\nConnection: close\r\n\r\n

我们必须将获取请求更正为

GET https://servername:9960/ HTTP/1.1\r\nHost: originalservername\r\nConnection: close\r\n\r\n

【讨论】:

    【解决方案2】:

    https://:443/ 不是有效的 URL - 没有主机名。

    从您的代码中,我看到您调用了UriBuilder.fromUri("https://0.0.0.0/")

    "0.0.0.0" 在这里真的是一个有效值吗?

    检查命令hostnamedomainname的输出;它们应该返回有用的值(domainname 不是那么重要,但如果它有一些有用的值会更好)。

    如何确定自己的IP地址另见这个答案:How to get the ip of the computer on linux through Java?

    [编辑]您可能在代码中查看了错误的位置。在URISyntaxException的构造函数中设置断点,找出损坏的URI是从哪里来的。

    【讨论】:

    • 泽西工厂从 URI u 内部分配它: final String host = (u.getHost() == null) ? NetworkListener.DEFAULT_NETWORK_HOST : u.getHost();使用常量 String DEFAULT_NETWORK_HOST = "0.0.0.0" 但同样的问题是 2 个网络侦听器 1 用于 localhost,另一个用于服务器 IP。
    • 啊。您发布的代码用于设置 Jersy。但正如您在日志中看到的那样,该部分确实有效(端口 = 9660)。您需要检查为 SSL 访问创建 URL 的代码(端口为 443 的代码)。
    • 服务器运行。端口 443 上没有网络侦听器。此请求来自哪里?网络统计-apl | grep 443 unix 2 [ACC] STREAM LISTENING 27443 - 私有/scache
    • 我正在努力从安全部门打开一个端口以进行调试。
    • 正如我所说:在构造函数中创建一个断点,你就会知道。任何试图建立连接的人最终都必须通过这部分代码,否则您将不会在日志中看到异常:-)
    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2012-08-06
    • 2011-04-11
    • 2013-07-29
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多