Any idea what I'm missing?
On 2/22/06, Scott McCoy <[EMAIL PROTECTED]> wrote:
Thanks for your input, although this does generate working code and my actual problem, was that in xsd. But before I complete this project, I do have the requirement of ensuring WS-I compliance, and I think this will help me move in that direction.
Thanks,
Scott S. McCoyOn 2/22/06, Anne Thomas Manes < [EMAIL PROTECTED]> wrote:Scott, there are a bunch of errors in your WSDL. I've corrected a few of them (including notes about the corrections in comments):
<wsdl:definitions name="urn:Account"
targetNamespace=" http://plm.marchex.com/service/account"
xmlns:tns=" http://plm.marchex.com/service/account "
xmlns:typens="http://plm.marchex.com/service/account"
xmlns:authns=" http://plm.marchex.com/credentials "
<!-- wrong version of XML Schema
xmlns:xsd="http://www.w3.org/1999/XMLSchema "
-->
xmlns:xsd=" http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/ "
xmlns:wsdl=" http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<!-- Use xsd:import or xsd:include to import xsd definitions -->
<xsd:schema targetNamespace=" http://plm.marchex.com/services/account">
<xsd:include schemaLocation="account.xsd"/>
<xsd:import namespace=" http://plm.marchex.com/credentials "
schemaLocation="credentials.xsd"/>
</xsd:schema>
</wsdl:types>
<!-- Use wsdl:import only to import wsdl files
<wsdl:import namespace=" http://plm.marchex.com/service/account"
location="account.xsd"/>
<wsdl:import namespace=" http://plm.marchex.com/credentials"
location="credentials.xsd"/>
-->
<!-- If you want to use the wrapped convention, then you must define a
different set of request and response messages for each operation.
The element referenced by the input message part must be a
"wrapper" element that has the same name as the operation. If you
prefer to not use the wrapped convention, you still must define a
unique input message for operation becuase the input element for
each operation must have a unique name.
-->
<wsdl:message name="CredentialsOnly">
<wsdl:part name="credentials" element="authns:credentials"/>
</wsdl:message>
<wsdl:message name="AccountList">
<wsdl:part name="accounts" element="tns:accounts"/>
</wsdl:message>
<-- You don't need to include the "credentials" part in each of your
messages. You can reference the "CredentialsOnly" message for
your header elements. (Definitely cleaner if you want to use the
same header in multiple messages.)
-->
<wsdl:message name="AccountDetails">
<wsdl:part name="credentials" element="authns:credentials"/>
<wsdl:part name="account" element="tns:account"/>
</wsdl:message>
<wsdl:message name="UserDetails">
<wsdl:part name="credentials" element="authns:credentials"/>
<wsdl:part name="user" element="tns:user"/>
</wsdl:message>
<!-- we need to return a different message than we accept -->
<wsdl:message name="AccountResponse">
<wsdl:part name="accountlist" element="tns:account"/>
</wsdl:message>
<wsdl:message name="UserResponse">
<wsdl:part name="userlist" element="tns:user"/>
</wsdl:message>
<wsdl:message name="empty"/>
<wsdl:portType name="AccountPortType">
<wsdl:operation name="createAccount">
<wsdl:input message="tns:AccountDetails"/>
<wsdl:output message="tns:AccountResponse"/>
</wsdl:operation>
<!-- When using document style, each input message must be unique.
You must define different input messages for createAccount,
updateAccount, and cancelAccount. I suggest you follow the
wrapped convention (create a wrapper element for each operation
in which the wrapper element has the same name as the operation).
-->
<wsdl:operation name="updateAccount">
<wsdl:input message="tns:AccountDetails"/>
<wsdl:output message="tns:empty"/>
</wsdl:operation>
<wsdl:operation name="listAccounts">
<wsdl:input message="tns:CredentialsOnly"/>
<wsdl:output message="tns:AccountList"/>
</wsdl:operation>
<wsdl:operation name="cancelAccount">
<wsdl:input message="tns:AccountDetails"/>
<wsdl:output message="tns:empty"/>
</wsdl:operation>
<wsdl:operation name="createUser">
<wsdl:input message="tns:UserDetails"/>
<wsdl:output message="tns:UserResponse"/>
</wsdl:operation>
<wsdl:operation name="updateUser">
<wsdl:input message="tns:UserDetails"/>
<wsdl:output message="tns:empty"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="AccountSOAPBinding" type="tns:AccountPortType">
<!-- There's no such WSDL style as "wrapped". Wrapped is simply a convention
for document/literal that produces an RPC-like programming interface.
<soap:binding style="wrapped"
transport="http://schemas.xmlsoap.org/soap/http"/>
-->
<soap:binding style="document"
transport=" http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="createAccount">
<soap:operation soapAction="createAccount"/>
<wsdl:input>
<!-- In theory, this should explicitly specify the following goes
through the Header only -->
<!-- soap:body definition must appear before the soap:header definition
soap:body uses the "parts" attribute rather than the "part" attribute
(the "parts" attribute would not be necessary if you didn't define the
"credentials" part in each of your input messages)
soap:header requires an additional "message" attribute (the header
can be defined in a separate message)
<soap:header use="literal" part="credentials"/>
<soap:body use="literal" part="account"/>
-->
<soap:body use="literal" parts="account"/>
<soap:header message="tns:AccountDetails" use="literal" part="credentials"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<!-- Make comparable changes to the other bindings -->
Regards,
AnneOn 2/22/06, Scott McCoy < [EMAIL PROTECTED]> wrote:Okay,
I have a hand-crafted WSDL I'm using to generate Java with WSDL2Java and I'm using the deployment descriptor generated by WSDL2Java to generate a server-config.wsdd, which I package in a war and deploy to my tomcat server.
This has all been working fine and dandy, util today, when I added a new method that uses (an element and message I had already used before)...But I'm ending up with this error:Fault - Bean attribute password is of typeThe only thing that really makes me scratch my head here is that I thought xsd:string *was* a simple type? I've got the WSDL and XSDs generating the code in question attached to this message.
java.lang.String, which is not a simple type
AxisFault
faultCode: {
http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
faultSubcode:
faultString: Bean attribute password is of type java.lang.String, which is not a simple type
faultActor:
faultNode:
faultDetail:
{
http://xml.apache.org/axis/}hostname:sludge.marchex.com
Thanks,Scott S. McCoy
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="urn:Account"
targetNamespace="http://plm.marchex.com/service/account"
xmlns:tns="http://plm.marchex.com/service/account"
xmlns:typens="http://plm.marchex.com/service/account"
xmlns:authns="http://plm.marchex.com/credentials"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<xsd:schema targetNamespace="http://plm.marchex.com/service/account">
<xsd:include schemaLocation="account.xsd"/>
<xsd:import namespace="http://plm.marchex.com/credentials"
schemaLocation="credentials.xsd"/>
</xsd:schema>
</wsdl:types>
<!--
<wsdl:import namespace="http://plm.marchex.com/service/account"
location="account.xsd"/>
<wsdl:import namespace="http://plm.marchex.com/credentials"
location="credentials.xsd"/> -->
<wsdl:message name="Credentials">
<wsdl:part name="credentials" element="authns:credentials"/>
</wsdl:message>
<wsdl:message name="AccountList">
<wsdl:part name="accounts" element="tns:accounts"/>
</wsdl:message>
<wsdl:message name="AccountDetails">
<wsdl:part name="account" element="tns:account"/>
</wsdl:message>
<wsdl:message name="UserDetails">
<wsdl:part name="user" element="tns:user"/>
</wsdl:message>
<!-- we need to return a different message than we accept -->
<wsdl:message name="AccountResponse">
<wsdl:part name="accountlist" element="tns:account"/>
</wsdl:message>
<wsdl:message name="UserResponse">
<wsdl:part name="userlist" element="tns:user"/>
</wsdl:message>
<wsdl:message name="empty"/>
<wsdl:portType name="AccountPortType">
<wsdl:operation name="createAccount">
<wsdl:input message="tns:AccountDetails"/>
<wsdl:output message="tns:AccountResponse"/>
</wsdl:operation>
<wsdl:operation name="updateAccount">
<wsdl:input message="tns:AccountDetails"/>
<wsdl:output message="tns:empty"/>
</wsdl:operation>
<wsdl:operation name="listAccounts">
<wsdl:input message="tns:Credentials"/>
<wsdl:output message="tns:AccountList"/>
</wsdl:operation>
<wsdl:operation name="cancelAccount">
<wsdl:input message="tns:AccountDetails"/>
<wsdl:output message="tns:empty"/>
</wsdl:operation>
<wsdl:operation name="createUser">
<wsdl:input message="tns:UserDetails"/>
<wsdl:output message="tns:UserResponse"/>
</wsdl:operation>
<wsdl:operation name="updateUser">
<wsdl:input message="tns:UserDetails"/>
<wsdl:output message="tns:empty"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="AccountSOAPBinding" type="tns:AccountPortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="createAccount">
<soap:operation soapAction="createAccount"/>
<wsdl:input>
<!-- In theory, this should explicitly specify the following goes
through the Header only -->
<soap:body use="literal"/>
<soap:header message="tns:Credentials" use="literal"
part="credentials"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="updateAccount">
<soap:operation soapAction="createAccount"/>
<wsdl:input>
<soap:body use="literal"/>
<soap:header message="tns:Credentials" use="literal"
part="credentials"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="listAccounts">
<soap:operation soapAction="listAccounts"/>
<wsdl:input>
<soap:body use="literal"/>
<soap:header message="tns:Credentials" use="literal"
part="credentials"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="cancelAccount">
<soap:operation soapAction="cancelAccount"/>
<wsdl:input>
<soap:body use="literal"/>
<soap:header message="tns:Credentials" use="literal"
part="credentials"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="createUser">
<soap:operation soapAction="createUser"/>
<wsdl:input>
<soap:body use="literal"/>
<soap:header message="tns:Credentials" use="literal"
part="credentials"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="updateUser">
<soap:operation soapAction="updateUser"/>
<wsdl:input>
<soap:body use="literal"/>
<soap:header message="tns:Credentials" use="literal"
part="credentials"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="AccountService">
<!-- <wsdl:requestFlow> No such thing exists, this is just to remind me to
use a custom deploy.wsdd
<wsdl:handler
type="java:tufte.model.service.handlers.AuthenHandler"/>
</wsdl:requestFlow> -->
<wsdl:port name="AccountPort" binding="tns:AccountSOAPBinding">
<soap:address
location="http://localhost:8080/axis/services/Account"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
