繁体   English   中英

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

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

我遇到以下错误,并且在对该问题进行了广泛研究后,发现了一些类似的问题,但似乎无济于事。

我的错误:

    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创建的,因此所有代码基本上都已生成。 到目前为止,我将一直在查找“获取/发布”结果,但希望将其发布出去,因为我怀疑这可能是原因。

任何帮助是极大的赞赏。 让我知道是否忘记了可能共享的关键信息。

编辑

我想补充一点,我能够从用来尝试连接到BPEL服务的机器上访问Web浏览器中的终结点URL。 看来问题仅在于我从使用wsimport作为服务的WSDL的WSDL存​​根生成的客户端。

编辑2:开发/进度

问题似乎是,即使将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似乎认为“哦?您想要这个服务,到这里我给您提供,只有想要的WSDL是包装器,所以这是REAL WSDL。” 用简单的英语,您会获得它认为用于该服务的BPEL WSDL,并且其中包含Localhost地址。 现在,我尝试通过更改wazzoo中的错误来更改此WSDL中的地址,但更改BPEL。 因此,解决方法是在制作过程变量后在这一行中添加:(AKA THE FIX)

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

通常,在完成该过程之后,将端点设置为AGAIN,因为BPEL会覆盖您第一次发送的端点。 当然,这是一种解决方法,但是该过程现在运行良好。 如果您能想到一种绕过此工作并动态修复服务的方法,那么当我们将其移至Dev等新环境时,我们不必更改服务WSDL。我很高兴。 谢谢,我将一如既往地阅读评论以寻求建议。 =)

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

建议使用配置计划,以使复合材料特定于环境。

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

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

请考虑以下链接:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM