在Jboss EAP 6.4.x中部署时出现错误java.lang.NoClassDefFoundError:sun / net / www / protocol / https / HttpsURLConnectionImpl

时间:2017-11-06 11:21:26

标签: java jboss http-patch

我正在使用java.net编写一个rest客户端,它应该执行PATCH请求。但由于PATCH不是java.net中支持的方法,我使用反射通过更改代码(如

)来支持它
private void updateConnectionToSupportPatchRequest(final HttpURLConnection conn)
    throws ReflectiveOperationException {
    try {
        final Object targetConn;
        if (conn instanceof HttpsURLConnectionImpl) {
            final Field delegateField = HttpsURLConnectionImpl.class.getDeclaredField("delegate");
            delegateField.setAccessible(true);
            targetConn = delegateField.get(conn);
        } else {
            targetConn = conn;
        }
        final Field methodField = HttpURLConnection.class.getDeclaredField("method");
        methodField.setAccessible(true);
        methodField.set(targetConn, "PATCH");
    } catch (final NoSuchFieldException ex) {
        LOGGER.error("NoSuchFieldException: {} ", ex.getMessage());
    }
}

但是当我部署在JBoss中使用我的rest客户端的应用程序时,我收到了这个错误 -

java.lang.NoClassDefFoundError:sun / net / www / protocol / https / HttpsURLConnectionImpl

我查看了这个错误并发现了这篇文章http://planet.jboss.org/post/dealing_with_sun_jdk_related_noclassdeffounderror_under_jboss

我在帖子中尝试了建议的解决方案仍然得到相同的错误。关于如何通过这个问题的任何想法?

P.S。我不能使用Apache HttpClient或RestEasy(Jboss),因为在项目中使用的另一个3PP不支持Apache HttpClient

1 个答案:

答案 0 :(得分:0)

在尝试使用JDK的内部类之前,您是否尝试过using the workaround X-HTTP-Method-Override?如果是这种情况,您可以使用实例的getClass - 方法访问字段,并使用isAssignableFrom替代instanceof

另一种摆脱指定具体类的方法就是尝试在HttpsURLConnection中获取字段,并假设无法找到非Https-URLConnection字段。这可能类似于以下代码:

private void updateConnectionToSupportPatchRequest(final HttpURLConnection conn) 
    throws ReflectiveOperationException {
    try {
        final Object targetConn = conn;
        try {
            final Field delegateField = findField(conn.getClass(), "delegate");
            delegateField.setAccessible(true);
            targetConn = delegateField.get(conn);
        }
        catch(NoSuchFieldException nsfe) {
            // no HttpsURLConnection
        }
        final Field methodField = findField(conn.getClass(), "method");
        methodField.setAccessible(true);
        methodField.set(targetConn, "PATCH");
    } catch (final NoSuchFieldException ex) {
        LOGGER.error("NoSuchFieldException: {} ", ex.getMessage());
    }
}

private Field findField(Class clazz, String name) throws NoSuchFieldException {
    while (clazz != null) {
        try {
            return clazz.getDeclaredField(name);
        }
        catch(NoSuchFieldException nsfe) {
            // ignore
        }
        clazz = clazz.getSuperclass();
    }
    throw new NoSuchFieldException(name);
}

但是这可能会在另一个层面上失败,因为 - 很明显 - JBoss中使用的类不是您实现变通方法的类,因此字段和方法的名称可能不同。