Loading ...
Sorry, an error occurred while loading the content.

Re: [soaplite] problem creating an object to match the WSDL

Expand Messages
  • Duncan Cameron
    ... You want to override the default serialisation of a scalar ref. Create a serialiser for your formatEnum type: sub SOAP::Serializer::as_formatEnum { my
    Message 1 of 3 , Dec 9, 2002
    • 0 Attachment
      On 2002-12-09 sylvainstg <sylvainstg wrote:
      >Hi,
      >
      >I am trying to create objects that will give me the following XML:
      >
      ><formFieldVars SOAP-ENC:arrayType="namesp2:formFieldVar[3]" ...>
      > <item xsi:type="namesp2:formFieldVar">
      > <name xsi:type="xsd:string">CAMNamespace</name>
      > <value xsi:type="xsd:string">LDAP</value>
      >---
      > <format xsi:type="namesp2:formatEnum">not_encrypted</format>
      >---
      > </item>
      >
      >When writting perl like:
      >
      >my $header = SOAP::Header->name(
      > 'biBusHeader' => new biBusHeader(
      > new CAM(undef,'logon'),
      > new hdrSession([
      > new formFieldVar('CAMNamespace',
      >$namespace, new formatEnum('not_encrypted')),
      >[...]
      >
      >
      >The problem is that the above code gives me this XML:
      >
      ><formFieldVars SOAP-ENC:arrayType="namesp2:formFieldVar[3]" ...>
      > <item xsi:type="namesp2:formFieldVar">
      > <name xsi:type="xsd:string">CAMNamespace</name>
      > <value xsi:type="xsd:string">LDAP</value>
      >---
      > <format xsi:type="namesp2:formatEnum">
      > <c-gensym17 xsi:type="xsd:string">not_encrypted</c-gensym17>
      > </format>
      >---
      > </item>
      >
      >
      >It feels like the formFieldVar object is the culprit.
      >
      >package formatEnum;
      >sub new {
      > shift;
      > my ( $value ) = @_;
      > my $data = \SOAP::Data($value);
      >
      > bless $data;
      > return $data;
      >}
      >
      >I tried all I could think about, I cannot find a way to have the
      >provided string to formatEnum object to appear as the element text
      >while keeping the type of the format element (namesp2:formatEnum),
      >anything I do either turn the type to string or put the data in a
      >children node (c-gensym17)
      >
      >Any help much appreciated.

      You want to override the default serialisation of a scalar ref.

      Create a serialiser for your formatEnum type:

      sub SOAP::Serializer::as_formatEnum {
      my $self = shift;
      my($value, $name, $type, $attr) = @_;
      return [
      $name,
      {'xsi:type' => $self->maptypetouri($type), %$attr},
      $$value, # <= deref the scalar ref
      ];
      }

      Change your constructor to be simply:

      sub new {
      shift;
      my ( $value ) = @_;
      my $data = \$value;
      bless $data;
      return $data;
      }

      then refer to it as
      SOAP::Data->name(format => formatEnum->new('test'));

      Regards,
      Duncan Cameron
    Your message has been successfully submitted and would be delivered to recipients shortly.