JBoss WildFly 13 上的 RESTful Web 服务适用于浏览器和 curl,但不适用于单元测试 - 404 错误

Posted

技术标签:

【中文标题】JBoss WildFly 13 上的 RESTful Web 服务适用于浏览器和 curl,但不适用于单元测试 - 404 错误【英文标题】:RESTful web services on JBoss WildFly 13 works from browser & curl but not from Unit tests - 404 error 【发布时间】:2019-01-31 01:56:37 【问题描述】:

我在 JBoss WildFly 13.0.0.Final 上部署了一个应用程序,作为在 macOS High Sierra 10.13.6 上的 EE8 上运行的 EAR。从应用程序网页调用时,所有方法都可以正常工作。

我可以 ping 通“我的 IP 地址”,127.0.0.1 & locahost:

ping 192.999.9.255 PING 192.999.1.255 (192.999.9.255):56 个数据字节 64 个字节来自 192.999.1.23:icmp_seq=0 ttl=64 时间=0.067 ms 来自 192.999.1.23 的 64 个字节:icmp_seq=1 ttl=64 时间=0.147 毫秒 64 字节,来自 192.99.1.23:icmp_seq=2 ttl=64 时间=0.098 毫秒

PING 127.0.0.1 (127.0.0.1):来自 127.0.0.1 的 56 个数据字节 64 个字节: icmp_seq=0 ttl=64 time=0.046 ms 来自 127.0.0.1 的 64 个字节:icmp_seq=1 ttl=64 时间=0.085 ms 从 127.0.0.1 开始的 64 个字节:icmp_seq=2 ttl=64 时间=0.076 毫秒

PING localhost (127.0.0.1):来自 127.0.0.1 的 56 个数据字节 64 个字节: icmp_seq=0 ttl=64 time=0.041 ms 来自 127.0.0.1 的 64 个字节:icmp_seq=1 ttl=64 时间=0.084 ms 从 127.0.0.1 开始的 64 个字节:icmp_seq=2 ttl=64 时间=0.090 毫秒

我的 usr/hosts 是标准的:

127.0.0.1 本地主机

255.255.255.255 广播主机

::1 本地主机

fe80::1%lo0 本地主机

我可以访问其中一项 Web 服务并显示来自 curl 的 JSON:

MacBook-Pro:bin NOTiFY$ curl "http://localhost:8080/NOTiFYwell/notifywell/get-all-enumbers/"
[
  
    "id": "5b6c5dbefac4f7105b3cca2e",
    "code": "E100",
    "name": "Curcumin (from turmeric)",
    "colour": "Yellow-orange",
    "status": "Approved in the EU.Approved in the US."
  ,

从浏览器:

但是,当我运行 JUnit 5 测试时:

    @Test
    public final void test01GetListEnumbers() throws IOException 
        System.out.println(">>>>> test01GetListEnumbers .....");

        String url = "http://localhost:8080/NOTiFYwell/notifywell/get-all-enumbers/";
        System.out.println(">>>>> test01GetListEnumbers url = " + url);

        HttpGet httpGet = new HttpGet(url);
        httpGet.setHeader(CONTENT_TYPE, APPLICATION_JSON);

        //Execute and get the response.
        HttpClient httpClient = HttpClientBuilder.create().build();
        HttpResponse response = httpClient.execute(httpGet);

        System.out.println(">>>>> test01GetListEnumbers response getStatus = " + response.getStatusLine().getStatusCode());
        System.out.println(">>>>> test01GetListEnumbers response getEntity = " + EntityUtils.toString(response.getEntity()));

    

我明白了:

test01GetListEnumbers ..... test01GetListEnumbers url = http://localhost:8080/NOTiFYwell/notifywell/get-all-enumbers/ test01GetListEnumbers 响应 getStatus = 404 test01GetListEnumbers 响应 getEntity =

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 404 Not Found</title>
</head>
<body><h2>HTTP ERROR 404</h2>
<p>Problem accessing /NOTiFYwell/notifywell/get-all-enumbers/. Reason:
<pre>    Not Found</pre></p><hr><a 
href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.z-SNAPSHOT</a> 
<hr/>

</body>
</html>

在 WireShark 中我看到了:

3027 26.303256 127.0.0.1 127.0.0.1 HTTP 275 GET /NOTiFYwell/notifywell/get-all-enumbers/ HTTP/1.1

3028 26.303279 127.0.0.1 127.0.0.1 TCP 56 8080 → 50922 [ACK] Seq=1 Ack=220 Win=408064 Len=0 TSval=635600988 TSecr=635600988

3029 26.304989 127.0.0.1 127.0.0.1 HTTP 652 HTTP/1.1 404 未找到 (文本/html)

我所有的 JUnit 测试都在我之前的 MacBook Pro(2018 年 7 月)上使用 WildFly 12.0.0.Final 在 EE8 和 macOS High Sierra 10.13.6 上运行。我最近升级到在 EE8 上运行的 WildFly 13.0.0.Final。在这两种情况下,我访问 Web 服务的一系列单元测试都使用了 Apache HTTP Core 4.4.10、客户端 4.5.6 JAR。

尝试了许多 SO 建议均无济于事。

【问题讨论】:

看起来您在测试中使用的是 Jetty 而不是 WildFly。 【参考方案1】:

@James R. Perkins 感谢您为我指明正确的方向。我停止了 Wildfly 13,果然,我仍然在 8080 端口监听了一些东西

MacBook-Pro:bin NOTiFY$ sudo lsof -i :8080 密码:COMMAND PID 用户 FD 类型设备大小/关闭节点名称 java 437 通知 163u IPv6 0x299d8c12df3e5311 0t0 TCP 本地主机:http-alt (听)

杀死 PID 并再次运行我的 JUnit 测试并(如所愿)得到:

org.apache.http.conn.HttpHostConnectException:连接到 本地主机:8080 [本地主机/127.0.0.1,本地主机/0:0:0:0:0:0:0:1, localhost/fe80:0:0:0:0:0:0:1%1] 失败:连接被拒绝

重新启动 WildFly 13 并成功重新运行了我的 JUnit 测试:

test01GetListEnumbers url = http://localhost:8080/NOTiFYwell/notifywell/get-all-enumbers/ test01GetListEnumbers 响应 getStatus = 200 test01GetListEnumbers 响应 getEntity = [ “id”:“5b6c5dbefac4f7105b3cca2e”, “代码”:“E100”, “名称”:“姜黄素(来自姜黄)”, “颜色”:“黄橙色”, “状态”:“在欧盟获得批准。在美国获得批准。” ,

仍然不确定 Jetty 9.x 来自哪里。

这对应于在我使用“迁移助手”将所有内容从旧 MacBook 复制到新 MacBook 后必须重新启动 Mac。 Jetty 似乎在重新启动时启动。会调查。

【讨论】:

以上是关于JBoss WildFly 13 上的 RESTful Web 服务适用于浏览器和 curl,但不适用于单元测试 - 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

jboss/wildfly 中的缓存连接管理器

Wildfly 安全管理器:org.jboss.vfs.VirtualFilePermission 的权限失败

JBoss Wildfly 在 jboss-cli 命令行模式下显示属性值

当两个 jar 具有相同的类集时,使用 jboss/wildfly 的类加载冲突,如何设置顺序/优先级?

WildFly 服务器发出重复数据源

EJB远程客户端从JBoss AS 7.1迁移到Wildfly 8.1