Web服务WebSphere中的解组响应错误

时间:2014-11-12 16:15:42

标签: websphere jax-ws

我正在开发一个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
);
}

有没有人知道我的定义中的问题是什么?

此致。

2 个答案:

答案 0 :(得分:0)

问题是wsdl2java没有在@WebService注释中添加属性“endpointInterface”。您需要确保您的WSDL包含wsdl:portType。

IBM有一篇很棒的文章解释了WSDL到Java的映射:

http://publib.boulder.ibm.com/infocenter/wsdoc400/v6r0/index.jsp?topic=/com.ibm.websphere.iseries.doc/info/ae/ae/rwbs_map.html

答案 1 :(得分:0)

我建议您检查.wsdl是否具有complexType或者不是complexType name =“LoginResponse”。如果没有,你可能想尝试添加complexType name =“LoginResponse”... 我建议的第二件事是你可以切换你的websphere运行模式。如果您以开发模式运行,请取消选中该框,或者如果您在没有开发模式的情况下运行它,请选中该框,然后重试。这是我认为的缺陷。一旦您想要升级您的websphere,可能需要使用修订包。