为什么Url.OpenConnection()返回SoapHttpUrlConnection?

3
我正在开发一个Java应用程序(J2SE)。在我的应用程序中,我需要通过队列(使用Weblogic的JDNI)发送消息,然后应该与HTTP Web URL进行交互(使用URLConnection)。
如果我尝试使用URLConnection与HTTP Web进行交互,则会成功。但是,在通过队列发送消息后,使用URLConnection与HTTP Web进行交互始终失败。经过极大地减少源代码,最终我发现设置JDNI的代码影响了UrlConnection对象的生成。
以下是解释的源代码。
private void test() throws IOException, NamingExcpetion {
    HttpUrlConnection c1 = getConnection();
    System.out.println(c1);

    initContext();

    HttpUrlConnection c2 = getConnection();
    System.out.println(c2);
}


public void initContext() throws ... {
    Properties prop = new Properties();

    Prop.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
    Prop.put(Context.PROVIDER_URL, "t3://111.111.111.111:7100");  // my target weblogic server having queues.

    new InitialContext(prop);
    System.out.println("InitialContext() finished!!");
}

public HttpURLConnection getConnection() throws .... {
    URL url = new URL("http://222.222.222.222:8100/login");  // My target server to be interacting via URLConnection; I'm using java.net.URL
    return (HttpURLConnection) url.openConnection();
}


And below is the result.
sun.net.www.protocol.http.HttpURLConnection:http://222.222.222.222:8100/login
InitialContext() finished!!
weblogic.net.http.SOAPHttpURLConnection:http://222.222.222.222:8100/login

尽管InitialContext()方法调用已经完成,但我期望返回HttpURLConnection,但实际上由url.openConnection()返回了SOAPHttpURLConnection。因此,我无法使用它与网页交互。
为什么会返回SOAPHttpURLConnection?如何解决这个问题?

你在使用什么库来处理URL?是java.net.URL吗? - Wesley De Keirsmaeker
是的,我正在使用java.net.URL。 - Sung-Yoon
我觉得很奇怪,你从weblogic.net.http包中收到了一个SOAPHttpURLConnection。你能检查一下你的导入吗?https://docs.oracle.com/cd/E11035_01/wls100/javadocs/weblogic/net/http/SOAPHttpURLConnection.html - Wesley De Keirsmaeker
1
@WesleyDeKeirsmaeker,没有什么奇怪的。您应该能够像这样注册新的服务提供程序(或URLStreamHandlers)。 - Kayaman
我只是将wlfullclient.jar添加到构建路径中。(当然,JRE系统库也已添加。) - Sung-Yoon
1个回答

1
您可以通过设置系统属性UseSunHttpHandler来强制Weblogic使用默认处理程序。在JVM参数中添加-DUseSunHttpHandler=true。我知道您不是在Weblogic容器内运行,而只是在J2SE代码中运行,但我猜测Weblogic上下文工厂类或某些Weblogic库代码正在注册返回Weblogic HTTP处理程序的URLStreamHandlerFactory。我这样说的原因是JDK的URL类会缓存处理程序。因此,在您的情况下,在第一个请求期间,它应该已经从sun默认包中返回了HTTP处理程序并将其缓存,并始终从缓存中返回相同的处理程序。只有当有人注册新的URLStreamHandlerFactory时,JDK才会清除此处理程序缓存的可能情况。

验证此选项的其他方法:初始化Initialcontext后,请尝试调用URL.setURLStreamHandlerFactory。如果Weblogic已经注册了工厂,则应该会收到异常,因为JVM只允许调用该方法一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接