我正在使用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
答案 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中使用的类不是您实现变通方法的类,因此字段和方法的名称可能不同。