我正在开发一个Web服务客户端消费者。
使用cxf wsdltojava代码生成器生成客户端类。
当我在tomcat中运行客户端时,一切正常,但是当我部署客户端时 在WebSphere 7.0中,我得到unmarshaller错误:
org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperException: An internal assertion
error occurred. The com.mycompany.webservice.model.LoginResponse JAXB object does not have a LoginResponse xml property.
at org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperToolImpl.unWrap(JAXBWrapperToolImpl.java:83)
at org.apache.axis2.jaxws.marshaller.impl.alt.DocLitWrappedMethodMarshaller.demarshalResponse(DocLitWrappedMethodMarshaller.java:144)
... 16 more
wsdl是这样的:
<xsd:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
...
<xsd:element name="LoginResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="LoginResult" type="xsd:boolean"/>
<xsd:element minOccurs="0" maxOccurs="1" name="ticketID" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
,实体响应类是:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"loginResult",
"ticketID"
})
@XmlRootElement(name = "LoginResponse")
public class LoginResponse {
@XmlElement(name = "LoginResult")
protected boolean loginResult;
protected String ticketID;
,服务类是:
@WebService(targetNamespace = "http://tempuri.org/", name = "AuthenticationSoap")
@XmlSeeAlso({ObjectFactory.class})
public interface AuthenticationSoap {
@RequestWrapper(localName = "Login", targetNamespace = "http://tempuri.org/", className = "com.mycompany.webservice.model.Login")
@WebMethod(operationName = "Login", action = "http://tempuri.org/Login")
@ResponseWrapper(localName = "LoginResponse", targetNamespace = "http://tempuri.org/", className = "com.mycompany.webservice.model.LoginResponse")
@WebResult(name = "LoginResponse", targetNamespace = "http://tempuri.org/")
public LoginResponse login(
@WebParam(mode = WebParam.Mode.IN, name = "username", targetNamespace = "http://tempuri.org/")
java.lang.String username,
@WebParam(mode = WebParam.Mode.IN, name = "password", targetNamespace = "http://tempuri.org/")
java.lang.String password,
@WebParam(mode = WebParam.Mode.INOUT, name = "ticketID", targetNamespace = "http://tempuri.org/")
javax.xml.ws.Holder<java.lang.String> ticketID,
@WebParam(mode = WebParam.Mode.OUT, name = "LoginResult", targetNamespace = "http://tempuri.org/")
javax.xml.ws.Holder<java.lang.Boolean> loginResult
);
}
有没有人知道我的定义中的问题是什么?
此致。
答案 0 :(得分:0)
问题是wsdl2java没有在@WebService注释中添加属性“endpointInterface”。您需要确保您的WSDL包含wsdl:portType。
IBM有一篇很棒的文章解释了WSDL到Java的映射:
答案 1 :(得分:0)
我建议您检查.wsdl是否具有complexType或者不是complexType name =“LoginResponse”。如果没有,你可能想尝试添加complexType name =“LoginResponse”... 我建议的第二件事是你可以切换你的websphere运行模式。如果您以开发模式运行,请取消选中该框,或者如果您在没有开发模式的情况下运行它,请选中该框,然后重试。这是我认为的缺陷。一旦您想要升级您的websphere,可能需要使用修订包。