xsd2php icon indicating copy to clipboard operation
xsd2php copied to clipboard

Problem serializing generated subclass

Open 3thanZ opened this issue 9 years ago • 1 comments

Hi,

I have a complex XSD that I reversed engineered into PHP classes and JMS YAML using this project. For simplicity, I am only focusing on the PHP class EmployerId which is a subclass of EmployerIdType.

The generated YAML for EmployerId is:

Api\Models\Dimona\EmployerId:
    xml_root_name: EmployerId

The generated YAML for EmployerIdType is:

Api\Models\Dimona\EmployerIdType:
    properties:
        nOSSRegistrationNbr:
            expose: true
            access_type: public_method
            serialized_name: NOSSRegistrationNbr
            accessor:
                getter: getNOSSRegistrationNbr
                setter: setNOSSRegistrationNbr
            type: Api\Models\Dimona\NOSSRegistrationNbr
        provisionalNSSONbr:
            expose: true
            access_type: public_method
            serialized_name: ProvisionalNSSONbr
            accessor:
                getter: getProvisionalNSSONbr
                setter: setProvisionalNSSONbr
            type: Api\Models\Dimona\ProvisionalNSSONbr
        nOSSLPARegistrationNbr:
            expose: true
            access_type: public_method
            serialized_name: NOSSLPARegistrationNbr
            accessor:
                getter: getNOSSLPARegistrationNbr
                setter: setNOSSLPARegistrationNbr
            type: Api\Models\Dimona\NOSSLPARegistrationNbr
        companyID:
            expose: true
            access_type: public_method
            serialized_name: CompanyID
            accessor:
                getter: getCompanyID
                setter: setCompanyID
            type: Api\Models\Dimona\CompanyID

When I try to serialize the EmployerId class using the code below (in my test.php):

<?php 
require_once 'vendor/autoload.php';

use Api\Models\Dimona\EmployerId;
use Api\Models\Dimona\NaturalPerson;
use Api\Models\Dimona\DimonaFeatures;
use Api\Configuration\Config;
use JMS\Serializer\SerializerBuilder;
use JMS\Serializer\Handler\HandlerRegistryInterface;
use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\BaseTypesHandler;
use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\XmlSchemaDateHandler;

$employerId = new EmployerId();
$employerId->setNOSSRegistrationNbr(123456789); 

$serializerBuilder = SerializerBuilder::create();
$serializerBuilder->addMetadataDir("lib/Models/Dimona/JMS", "Api\Models\Dimona");
$serializerBuilder->configureHandlers(function (HandlerRegistryInterface $handler) use ($serializerBuilder) {
    $serializerBuilder->addDefaultHandlers();
    $handler->registerSubscribingHandler(new BaseTypesHandler());
    $handler->registerSubscribingHandler(new XmlSchemaDateHandler());
});

$serializer = $serializerBuilder->build();

print($serializer->serialize($employerId, "xml"));
print("\r\n");

?>

I get the error:

slyc-mbp-001:test-dimona-serialization ethansiew$ php test.php 
PHP Fatal error:  Call to a member function value() on a non-object in /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/Metadata/PropertyMetadata.php on line 90
PHP Stack trace:
PHP   1. {main}() /Users/ethansiew/git/test-dimona-serialization/test.php:0
PHP   2. JMS\Serializer\Serializer->serialize() /Users/ethansiew/git/test-dimona-serialization/test.php:27
PHP   3. PhpOption\Some->map() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/Serializer.php:85
PHP   4. call_user_func:{/Users/ethansiew/git/test-dimona-serialization/vendor/phpoption/phpoption/src/PhpOption/Some.php:89}() /Users/ethansiew/git/test-dimona-serialization/vendor/phpoption/phpoption/src/PhpOption/Some.php:89
PHP   5. JMS\Serializer\Serializer->JMS\Serializer\{closure}() /Users/ethansiew/git/test-dimona-serialization/vendor/phpoption/phpoption/src/PhpOption/Some.php:89
PHP   6. JMS\Serializer\Serializer->visit() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/Serializer.php:82
PHP   7. JMS\Serializer\GraphNavigator->accept() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/Serializer.php:176
PHP   8. JMS\Serializer\XmlSerializationVisitor->visitProperty() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php:235
PHP   9. JMS\Serializer\GraphNavigator->accept() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/XmlSerializationVisitor.php:302
PHP  10. JMS\Serializer\XmlSerializationVisitor->visitProperty() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php:235
PHP  11. JMS\Serializer\Metadata\PropertyMetadata->getValue() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/XmlSerializationVisitor.php:225

Fatal error: Call to a member function value() on a non-object in /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/Metadata/PropertyMetadata.php on line 90

Call Stack:
    0.0002     232088   1. {main}() /Users/ethansiew/git/test-dimona-serialization/test.php:0
    0.0147    2257488   2. JMS\Serializer\Serializer->serialize() /Users/ethansiew/git/test-dimona-serialization/test.php:27
    0.0156    2399976   3. PhpOption\Some->map() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/Serializer.php:85
    0.0156    2400152   4. call_user_func:{/Users/ethansiew/git/test-dimona-serialization/vendor/phpoption/phpoption/src/PhpOption/Some.php:89}() /Users/ethansiew/git/test-dimona-serialization/vendor/phpoption/phpoption/src/PhpOption/Some.php:89
    0.0156    2400248   5. JMS\Serializer\Serializer->JMS\Serializer\{closure}() /Users/ethansiew/git/test-dimona-serialization/vendor/phpoption/phpoption/src/PhpOption/Some.php:89
    0.0156    2400464   6. JMS\Serializer\Serializer->visit() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/Serializer.php:82
    0.0156    2403736   7. JMS\Serializer\GraphNavigator->accept() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/Serializer.php:176
    0.0252    2978144   8. JMS\Serializer\XmlSerializationVisitor->visitProperty() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php:235
    0.0252    2979072   9. JMS\Serializer\GraphNavigator->accept() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/XmlSerializationVisitor.php:302
    0.0271    2990352  10. JMS\Serializer\XmlSerializationVisitor->visitProperty() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/GraphNavigator.php:235
    0.0271    2990352  11. JMS\Serializer\Metadata\PropertyMetadata->getValue() /Users/ethansiew/git/test-dimona-serialization/vendor/jms/serializer/src/JMS/Serializer/XmlSerializationVisitor.php:225

I've attached the sample project. test-dimona-serialization.zip

Any advise is greatly appreciated.

3thanZ avatar Sep 01 '16 16:09 3thanZ

HI @goetas. Your advise is very much appreciated here. Thanks.

3thanZ avatar Sep 05 '16 03:09 3thanZ