艺龙的酒店预订功能,SOAP使用XML消息调用远程Login方法。
当执行到Dispatch.invoke时候就报初始化错误。请各位帮忙看下,谢谢!错误信息:
Exception in thread "main" javax.xml.ws.WebServiceException: java.lang.ExceptionInInitializerError
at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.doInvoke(DispatchImpl.java:188)
at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.invoke(DispatchImpl.java:195)
at com.lzxuni.service.Login.sendMsg(Login.java:72)
at com.lzxuni.service.Login.main(Login.java:44)
Caused by: java.lang.ExceptionInInitializerError
at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.doInvoke(DispatchImpl.java:173)
... 3 more
Caused by: java.lang.ClassCastException: com.sun.xml.bind.v2.runtime.JAXBContextImpl cannot be cast to com.sun.xml.internal.bind.api.JAXBRIContext
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.<clinit>(SOAPFaultBuilder.java:533)
... 4 more代码:private String wsdlUrl = "http://211.151.230.198/NorthBoundService/V1.1/NorthBoundAPIService.asmx";
private String ns = "http://elong.com/NorthBoundAPI/";
try {
URL url = new URL(wsdlUrl);
QName loginQName = new QName(ns,"NorthBoundAPIService");
Service service = Service.create(url,loginQName);
Dispatch<Source> dispatch = service.createDispatch(new QName(ns,"NorthBoundAPIServiceSoap"),
Source.class, Service.Mode.PAYLOAD);
LoginRequest lr = new LoginRequest();
lr.setUserName("aaa");
lr.setPassword("aaa");
JAXBContext ctx = JAXBContext.newInstance(LoginRequest.class);
Marshaller mar = ctx.createMarshaller();
mar.setProperty(Marshaller.JAXB_FRAGMENT, true);
StringWriter writer = new StringWriter();
mar.marshal(lr, writer);
String payload = "<Login xmlns=\"" + ns + "\">" + writer.toString() + "</Login>";
System.out.println(payload);
StreamSource ss = new StreamSource(new StringReader(payload));

Source source = dispatch.invoke(ss); //执行至此报错

} catch (IOException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "LoginRequest", propOrder = {
    "userName",
    "password"
})
public class LoginRequest
    extends Request
{    @XmlElement(name = "UserName")
    protected String userName;
    @XmlElement(name = "Password")
    protected String password;
}
程序生成xml内容:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<Login xmlns="http://elong.com/NorthBoundAPI/">
<loginRequest>
<UserName>aaa</UserName>
<Password>aaa</Password>
</loginRequest>
</Login>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>艺龙本身示例xml内容:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <Login xmlns="http://elong.com/NorthBoundAPI/">
      <loginRequest>
        <RequestHead>
          <LoginToken />
          <Language />
          <GUID />
          <Version />
          <TestMode>0</TestMode>
        </RequestHead>
        <UserName>aaa</UserName>
        <Password>aaa</Password>
      </loginRequest>
    </Login>
  </soap:Body>
</soap:Envelope>艺龙的wsdl的地址:
http://211.151.230.198/NorthBoundService/V1.1/NorthBoundAPIService.asmx?wsdlwebservicesoap