Java Jersey Grizzly restful服务器在Linux上抛出了一个奇怪的URISyntaxException

Java Jersey Grizzly restful服务器在Linux上抛出了一个奇怪的URISyntaxException,java,rest,https,glassfish,jersey,Java,Rest,Https,Glassfish,Jersey,我创建了一个Jersey Grizzy服务器,它在Win7上运行良好。但是在开始使用Linux之后,我会遇到一个奇怪的、总是重复的异常 java.lang.IllegalArgumentException: java.net.URISyntaxException: Expected hostname at index 8: https://:443/ ,即使没有调用服务器。其余的服务一直在工作。anbody有没有想法,为什么会出现这种异常,或者如何开始调试grizzly2 Httpserver

我创建了一个Jersey Grizzy服务器,它在Win7上运行良好。但是在开始使用Linux之后,我会遇到一个奇怪的、总是重复的异常

java.lang.IllegalArgumentException: java.net.URISyntaxException: Expected hostname at index 8: https://:443/
,即使没有调用服务器。其余的服务一直在工作。anbody有没有想法,为什么会出现这种异常,或者如何开始调试grizzly2 Httpserver

服务器启动的实现方式如下:

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)
    ... 
https://:443/不是有效的URL-没有主机名

从您的代码中,我看到您调用UriBuilder.fromUrihttps://0.0.0.0/

这里的0.0.0.0真的是有效值吗

检查命令hostname和domainname的输出;他们应该返回有用的值domainname并不是那么重要,但是如果它有一些有用的值就更好了

另请参见以下答案,即如何确定自己的IP地址:


[编辑]您可能在代码中看到了错误的位置。在URISyntaxException的构造函数中设置一个断点,并找出断开的URI的来源。

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

GET / HTTP/1.1\r\nHost: \r\nConnection: close\r\n\r\n
我们必须将Get请求更正为

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

您是否配置了环回地址/etc/hosts,可能是在您的linux发行版中?我们已经使用127.0.0.1 localhosts配置了/etc/hosts,可以让Jersey Logger工作。在那里我可以看到我的服务器被调用的位置。看起来reverseproxy正在调用端口9960而不是443。Jersey工厂从URI u内部分配它:final String host=u.getHost==null?NetworkListener.DEFAULT\u NETWORK\u HOST:u.getHost;使用常量字符串DEFAULT_NETWORK_HOST=0.0.0.0,但具有相同的ISU,其中2个网络侦听器1用于localhost,另一个用于服务器IP.Ah。您发布的代码用于设置Jersy。但这一部分确实可以工作,正如您在log port=9660中看到的那样。您需要检查为端口为443的SSL访问代码创建URL的代码。服务器正在运行。端口443上没有networklistener。这个请求来自哪里?netstat-apl | grep443unix2[ACC]流监听27443-private/scacheI正在获取从安全部门打开的用于调试目的的端口。正如我所说的:在构造函数中创建断点,您就会知道。任何试图建立连接的人最终都必须通过这部分代码,否则您不会在日志中看到异常:-