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

时间:2016-02-11 07:06:04

标签: java url weblogic httpurlconnection initial-context

我正在开发一个Java应用程序(J2SE)。 在我的应用程序中,我应该通过队列发送消息(使用Weblogic的JDNI) 然后应该与HTTP web url交互(使用URLConnection)。

如果我尝试使用URLConnection与HTTP web进行交互,则会成功。 但是,在队列发送消息后,与HTTP Web(使用URLConnection)的交互总是失败。在我极度减少源代码之后,最后我发现用于设置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,但实际上SOAPLttpURLConnection已由url.openConnction()返回;所以,我无法使用它与网页进行交互。

为什么SOAPHttpURLConnection已经返回? 我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可以通过设置系统属性UseSunHttpHandler强制weblogic使用默认处理程序。将-DUseSunHttpHandler=true添加到JVM参数中。我知道你没有在weblogic容器中运行,只是在J2SE代码中运行,但我想weblogic上下文工厂类或一些weblogic库代码正在注册URLStreamHandlerFactory,它返回weblogic http处理程序。我之所以这么说是因为JDK的URL类缓存了处理程序。因此,在第一次请求中,它从sun默认pkg返回HTTP处理程序时,它应该缓存它并始终从缓存中返回相同的处理程序。只有当JDK清除此Handler缓存时,才有可能是某人注册了一个新的URLStreamHandlerFactory。

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