Java 对SOAP Web服务的调用永远不会返回
我最近一直在努力用Java创建一个简单的soap web服务客户端。我使用了来自不同jax-ws实现的几个工具从WSDL生成客户机。即使生成了客户机,每当我尝试调用该服务上的方法时,我从未收到来自该方法的结果(调用该方法后从未返回) 示例代码:Java 对SOAP Web服务的调用永远不会返回,java,web-services,soap,wsdl,Java,Web Services,Soap,Wsdl,我最近一直在努力用Java创建一个简单的soap web服务客户端。我使用了来自不同jax-ws实现的几个工具从WSDL生成客户机。即使生成了客户机,每当我尝试调用该服务上的方法时,我从未收到来自该方法的结果(调用该方法后从未返回) 示例代码: try { TerytWs1Locator locator = new TerytWs1Locator(); ITerytWs1 service = locator.getcustom(); // If authori
try {
TerytWs1Locator locator = new TerytWs1Locator();
ITerytWs1 service = locator.getcustom();
// If authorization is required
((CustomStub)service).setUsername("XXX");
((CustomStub)service).setPassword("YYY");
// invoke business method
System.out.println(service.czyZalogowany());
} catch (javax.xml.rpc.ServiceException ex) {
ex.printStackTrace();
} catch (java.rmi.RemoteException ex) {
ex.printStackTrace();
}
因此,在本例中,println永远不会作为程序stucks on service.czyZalogowany()方法调用
我认为服务可能没有运行,因此我在.NET中生成了示例客户端:
try
{
var proxy = new ChannelFactory<ServiceReference1.ITerytWs1>("custom");
proxy.Credentials.UserName.UserName = "XXX";
proxy.Credentials.UserName.Password = "YYY";
var result = proxy.CreateChannel();
var test = result.CzyZalogowany();
}catch (Exception ex) { }
试试看
{
var proxy=新渠道工厂(“定制”);
proxy.Credentials.UserName.UserName=“XXX”;
proxy.Credentials.UserName.Password=“YYY”;
var result=proxy.CreateChannel();
var test=result.CzyZalogowany();
}捕获(例外情况除外){}
我可以轻松调用任何具有所需结果的方法
我的Java代码有什么问题
以下是该服务的wsdl:
这一款适合我
private String user = "XXX";
private String passwordSTR = "XXX";
private final String WSSE = "wsse";
private final String WSA = "wsa";
private final String TEM_URI="http://tempuri.org/";
private final String TEM="tem";
private final String IS_LOGGED = "CzyZalogowany";
private String SERVICE_PATH = "https://uslugaterytws1test.stat.gov.pl/TerytWs1.svc";
TerytServiceWS(){
}
public boolean isLogged(){
WebServiceTemplate wsTempl = new WebServiceTemplate();
wsTempl.setDefaultUri(SERVICE_PATH);
String result = "false";
WebServiceMessage message;
try {
message = (WebServiceMessage) wsTempl.sendAndReceive(new WebServiceMessageCallback() {
public void doWithMessage(WebServiceMessage message) {
try {
SaajSoapMessage soapMessage = (SaajSoapMessage) message;
SOAPMessage smc = soapMessage.getSaajMessage();
SOAPHeader header = smc.getSOAPHeader();
SOAPElement security =
header.addChildElement("Security", WSSE, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement usernameToken =
security.addChildElement("UsernameToken", WSSE);
usernameToken.addAttribute(new QName("xmlns:wsu"), "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
SOAPElement username =
usernameToken.addChildElement("Username", WSSE);
username.addTextNode(user);
SOAPElement password =
usernameToken.addChildElement("Password", WSSE);
password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
password.addTextNode(passwordSTR);
SOAPElement action =
header.addChildElement("Action", WSA, "http://www.w3.org/2005/08/addressing");
action.addTextNode("http://tempuri.org/ITerytWs1/"+IS_LOGGED);
SOAPBody soapBody = smc.getSOAPBody();
QName isLoggedQName = new QName(TEM_URI, IS_LOGGED, TEM);
soapBody.addChildElement(isLoggedQName);
((SaajSoapMessage) message).setSaajMessage(smc);
} catch (Exception e) {
}
}
}, new WebServiceMessageExtractor() {
public Object extractData(WebServiceMessage message) throws IOException {
return message;
}
});
SOAPMessage saajMessage = ((SaajSoapMessage) message).getSaajMessage();
SOAPBody soapBody = saajMessage.getSOAPBody();
NodeList responseNodeList = soapBody.getChildNodes();
for (int count = 0; count < responseNodeList.getLength(); count++) {
org.w3c.dom.Node tempNode = responseNodeList.item(count);
if (tempNode.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
if (tempNode.getLocalName().equals("CzyZalogowanyResponse")) {
org.w3c.dom.Node responseNode = tempNode.getFirstChild();
if (responseNode.getLocalName().equals("CzyZalogowanyResult")) {
if (responseNode.getFirstChild()!=null)
result = responseNode.getFirstChild().getTextContent();
}
}
}
else{
return false;
}
}
}catch (Exception e){
}
return Boolean.valueOf(result);
}
private String user=“XXX”;
私有字符串passwordSTR=“XXX”;
私有最终字符串WSSE=“WSSE”;
私有最终字符串WSA=“WSA”;
私有最终字符串TEM_URI=”http://tempuri.org/";
私有最终字符串TEM=“TEM”;
私有最终字符串是_LOGGED=“CzyZalogowany”;
专用字符串服务_路径=”https://uslugaterytws1test.stat.gov.pl/TerytWs1.svc";
TerytServiceWS(){
}
公共布尔值isloged(){
WebServiceTemplate wsTemp=新的WebServiceTemplate();
wstemple.setDefaultUri(服务路径);
String result=“false”;
WebServiceMessage消息;
试一试{
message=(WebServiceMessage)wsTemp.sendAndReceive(新的WebServiceMessageCallback()){
公共无效doWithMessage(WebServiceMessage消息){
试一试{
SaajSoapMessage soapMessage=(SaajSoapMessage)消息;
SOAPMessage smc=SOAPMessage.getSaajMessage();
SOAPHeader=smc.getSOAPHeader();
SOAPElement安全性=
header.addChildElement(“安全性”,WSSE,”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement用户名令牌=
addChildElement(“UsernameToken”,WSSE);
usernameToken.addAttribute(新的QName(“xmlns:wsu”),”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
SOAPElement用户名=
usernameToken.addChildElement(“用户名”,WSSE);
username.addTextNode(用户);
SOAPElement密码=
usernameToken.addChildElement(“密码”,WSSE);
password.setAttribute(“类型”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
password.addTextNode(passwordSTR);
SOAPElement动作=
header.addChildElement(“操作”,WSA,”http://www.w3.org/2005/08/addressing");
action.addTextNode(“http://tempuri.org/ITerytWs1/“+已记录);
SOAPBody SOAPBody=smc.getSOAPBody();
QName isLoggedQName=新的QName(TEM_URI,IS_LOGGED,TEM);
soapBody.addChildElement(isLoggedQName);
((SaajSoapMessage)消息);
}捕获(例外e){
}
}
},新的WebServiceMessageExtractor(){
公共对象提取数据(WebServiceMessage消息)引发IOException{
返回消息;
}
});
SOAPMessage saajMessage=((SaajSoapMessage)message.getSaajMessage();
SOAPBody SOAPBody=saajMessage.getSOAPBody();
NodeList responseNodeList=soapBody.getChildNodes();
对于(int count=0;count