[英]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存根生成的客户端。
问题似乎是,即使将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.