Java Web 服务客户端无法连接到 BPEL Web 服务,而 SoapUI 可以

Java Web service client can't connect to BPEL webservice when SoapUI can

我遇到了以下错误,在对此事进行了一些类似问题的广泛研究后,none 似乎有所帮助。

我的错误:

    com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.ConnectException: Connection refused: connect
    at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:121)
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:142)
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:83)
    at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:105)
    at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:587)
    at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:546)
    at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:531)
    at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:428)
    at com.sun.xml.internal.ws.client.Stub.process(Stub.java:211)
    at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:124)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
    at com.sun.proxy.$Proxy33.onboardPerson(Unknown Source)
    at com.paychex.corp.fileloader.FileloaderMain.callWebService(FileloaderMain.java:202)
    at com.paychex.corp.fileloader.FileloaderMain.main(FileloaderMain.java:104)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:163)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:411)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:525)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:208)
    at sun.net.www.http.HttpClient.New(HttpClient.java:291)
    at sun.net.www.http.HttpClient.New(HttpClient.java:310)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:987)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:966)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:841)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1031)
    at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:109)

我的客户端是使用从活动服务可见的 WSDL 文件从 wsimport 生成的。代码连接示例:URL和服务名称等都正确,为了安全不能列出

URL url = new URL("http://correctserviceurl?WSDL");
        QName qname = new QName("http://correct servicelocation","nameofService");
        CorporateEmployeeOnboardingService service = new CorporateEmployeeOnboardingService(url, qname);

        //CorporateEmployeeOnboardingService service = new CorporateEmployeeOnboardingService();
        CorporateEmployeeOnboardingProcess process = service.getICorporateEmployeeOnboardingProcess();
        OnboardRequestType onboardRequest = new OnboardRequestType();

/**
         * TESTING SECTION FOR PROCESS CALL
         */
        //create necessary complex types:
        GregorianCalendar gregorianCalendar = new GregorianCalendar();
        DatatypeFactory datatypeFactory;
        datatypeFactory = DatatypeFactory.newInstance();
        XMLGregorianCalendar testDate = 
            datatypeFactory.newXMLGregorianCalendar(gregorianCalendar);
        testDate.setYear(1991);
        testDate.setMonth(4);
        testDate.setDay(3);
        AssignmentComplexType testAssignment = new AssignmentComplexType();
        testAssignment.setHiringManagerID("123445");
        //set person to send
        person.setSSN("333-33-3333");
        person.setFirstName("testFname");
        person.setLastName("testLname");
        person.setDOB(testDate);
        person.setHireDate(testDate);
        person.setAssignment(testAssignment);
        /**
         * end testing section of the person creation
         */
        onboardRequest.getPerson().add(person);//add a person to the array of people for the request
    ServiceResponse response = process.onboardPerson(onboardRequest);

如前所述,SoapUI 可以发送相同的测试信息并从服务中获得完全有效的请求。所有信息都一样。我已经研究了一段时间并确认没有代理,两者都是相同的位(在这种情况下都是 32/64 都是 32),服务名称和 WSDL 是正确的并且对象被正确命名等。我做了进一步的调试试图解决这个似乎没有可用信息的可怕错误代码,并使用 wireshark 将 SoapUI 请求与 java 请求进行比较,发现 SoapUI 使用 POST 而 java 客户端使用 GET让我现在依靠这个作为通用拒绝连接错误的来源。

该服务正在使用 BPEL 运行 并且是使用 BPEL 创建的,所以基本上所有代码都是生成的。我现在会查看 Get/post 的发现,但我想把它拿出来,因为我怀疑这可能是原因。

非常感谢任何帮助。如果我忘记了我可以分享的任何关键信息,请告诉我。

编辑

我想补充一点,我能够从我用来尝试连接到 BPEL 服务的计算机的 Web 浏览器中访问端点 URL。看来问题完全出在从 WSDL 存根生成的客户端上,我将 wsimport 用于服务的 WSDL。

编辑 2:Development/Progress

问题似乎是即使在将 qname 设置为正确的地址后,客户端仍在向本地主机发送响应。我现在正试图弄清楚这个本地主机的设置位置。任何有关此开发的想法都将不胜感激。

已经有一段时间了,但我相信这句话:URL url = new URL("http://correctserviceurl?WSDL");

需要阅读:URL url = new URL("http://correctserviceurl");

K!我认为这是 BPEL 的一个问题。相当令人沮丧。显然在以下几行中初始化服务后:

URL url = new URL("http://serviceaddresshere?WSDL");
        QName qname = new QName("http://servicelocationaddress","NameOfService");
        CorporateEmployeeOnboardingService service = new CorporateEmployeeOnboardingService(url, qname);

        CorporateEmployeeOnboardingProcess process = service.getICorporateEmployeeOnboardingProcess();

BPEL 获取带有服务 WSDL 和正确地址的请求。但是,BPEL 似乎认为 "O? you want this service, here you go I'll give you that, only the WSDL you want is wrapper, so here's the REAL WSDL." 用简单的英语来说,您会得到它认为用于服务的 BPEL WSDL,其中包含本地主机地址。现在我尝试更改此 WSDL 中的地址,但 BPEL 通过错误向上 wazzoo。因此,解决方法是在生成过程变量后在这一行中添加:(AKA THE FIX)

((BindingProvider) process).getRequestContext().put(Dispatch.ENDPOINT_ADDRESS_PROPERTY, "http://the serviceaddress");

基本上,您在完成流程后再次设置端点,因为 BPEL 会覆盖您第一次发送的内容。这当然是一种变通方法,但该过程现在运行良好。如果您能想出一种方法来绕过这项工作并动态修复服务,那么当我们将 ti 移动到 Dev 等新环境时,我们不必不断更改服务 WSDL。我洗耳恭听。谢谢,一如既往,我会阅读评论以获取建议。 =)

您可以使用 bpel 配置计划在环境之间切换。

配置计划是用于使复合材料环境特定的推荐选项。

配置计划的高效使用可以大大减少每个进程所需的工作。

可以从 composite.xml 文件生成配置计划。

请考虑这个link:

http://biemond.blogspot.com.br/2010/02/web-service-references-and-soa.html