Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.9.0] InvalidArgumentException Can't use incorrect type #844

Closed
szepczynski opened this issue Mar 22, 2021 · 4 comments · Fixed by #845
Closed

[3.9.0] InvalidArgumentException Can't use incorrect type #844

szepczynski opened this issue Mar 22, 2021 · 4 comments · Fixed by #845

Comments

@szepczynski
Copy link
Contributor

Q A
Bug report? yes

Hi,

After upgrade jms/serializer-bundle from 3.8.0 to 3.9.0 I'm getting exception:

InvalidArgumentException:
Can't use incorrect type object for collection in Doctrine\ORM\PersistentCollection:owner

  at vendor/jms/serializer/src/Metadata/Driver/DocBlockTypeResolver.php:223
  at JMS\Serializer\Metadata\Driver\DocBlockTypeResolver->expandClassNameUsingUseStatements()
     (vendor/jms/serializer/src/Metadata/Driver/DocBlockTypeResolver.php:283)
  at JMS\Serializer\Metadata\Driver\DocBlockTypeResolver->resolveType()
     (vendor/jms/serializer/src/Metadata/Driver/DocBlockTypeResolver.php:193)
  at JMS\Serializer\Metadata\Driver\DocBlockTypeResolver->resolveTypeFromTypeNode()
     (vendor/jms/serializer/src/Metadata/Driver/DocBlockTypeResolver.php:112)
  at JMS\Serializer\Metadata\Driver\DocBlockTypeResolver->getPropertyDocblockTypeHint()
     (vendor/jms/serializer/src/Metadata/Driver/DocBlockDriver.php:63)
  at JMS\Serializer\Metadata\Driver\DocBlockDriver->loadMetadataForClass()
     (vendor/jms/metadata/src/Driver/LazyLoadingDriver.php:38)
  at Metadata\Driver\LazyLoadingDriver->loadMetadataForClass()
     (vendor/jms/metadata/src/MetadataFactory.php:111)
  at Metadata\MetadataFactory->getMetadataForClass()
     (vendor/jms/serializer/src/Handler/ArrayCollectionHandler.php:75)
  at JMS\Serializer\Handler\ArrayCollectionHandler->serializeCollection()
     (vendor/jms/serializer/src/GraphNavigator/SerializationGraphNavigator.php:205)
  at JMS\Serializer\GraphNavigator\SerializationGraphNavigator->accept()
     (vendor/jms/serializer/src/JsonSerializationVisitor.php:137)
  at JMS\Serializer\JsonSerializationVisitor->visitProperty()
     (vendor/jms/serializer/src/GraphNavigator/SerializationGraphNavigator.php:260)
  at JMS\Serializer\GraphNavigator\SerializationGraphNavigator->accept()
     (vendor/jms/serializer/src/JsonSerializationVisitor.php:137)
  at JMS\Serializer\JsonSerializationVisitor->visitProperty()
     (vendor/jms/serializer/src/GraphNavigator/SerializationGraphNavigator.php:260)
  at JMS\Serializer\GraphNavigator\SerializationGraphNavigator->accept()
     (vendor/jms/serializer/src/JsonSerializationVisitor.php:93)
  at JMS\Serializer\JsonSerializationVisitor->visitArray()
     (vendor/jms/serializer/src/GraphNavigator/SerializationGraphNavigator.php:166)
  at JMS\Serializer\GraphNavigator\SerializationGraphNavigator->accept()
     (vendor/jms/serializer/src/JsonSerializationVisitor.php:93)
  at JMS\Serializer\JsonSerializationVisitor->visitArray()
     (vendor/jms/serializer/src/GraphNavigator/SerializationGraphNavigator.php:166)
  at JMS\Serializer\GraphNavigator\SerializationGraphNavigator->accept()
     (vendor/jms/serializer/src/Serializer.php:252)
  at JMS\Serializer\Serializer->visit()
     (vendor/jms/serializer/src/Serializer.php:163)
  at JMS\Serializer\Serializer->serialize()
     (src/Infrastructure/Symfony/Controller/ApiController.php:137)
  at Infrastructure\Symfony\Controller\ApiController->serialize()
     (src/Infrastructure/Symfony/Controller/ApiController.php:112)
  at Infrastructure\Symfony\Controller\ApiController->response()
     (src/Infrastructure/Symfony/Controller/ApiController.php:101)
  at Infrastructure\Symfony\Controller\ApiController->response()
     (src/UI/API/PatientController.php:422)
  at UI\API\PatientController->orders()
     (vendor/symfony/http-kernel/HttpKernel.php:157)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw()
     (vendor/symfony/http-kernel/HttpKernel.php:79)
  at Symfony\Component\HttpKernel\HttpKernel->handle()
     (vendor/symfony/http-kernel/Kernel.php:195)
  at Symfony\Component\HttpKernel\Kernel->handle()
     (public/index.php:24)                
@alexander-schranz
Copy link
Contributor

alexander-schranz commented Mar 22, 2021

We @sulu are running into the same issue, that now types are read from the DocBlocks which we really want to avoid, as they are definitly not be written to be used by the serializer.

I think this is related to #824 and the DocBlockDriver should be optional. So I think we need add a new config parameter so this new metadata driver is enabled by default.

Example 1:

    /**
     * @var string|bool|array
     * @Groups({"frontend"})
     */
    private $value;

Ends with:

Can't use union type string|bool|array for collection in Sulu\Component\Content\Compat\PropertyParameter:value

Example 2 (Doctrine)

    /**
     * The entity that owns this collection.
     *
     * @var object
     */
    private $owner;

Ends with:

Can't use incorrect type object for collection in Doctrine\ORM\PersistentCollection:owner

@alexander-schranz
Copy link
Contributor

I created a PR: #845 @goetas what do you think?

@mbabker
Copy link
Contributor

mbabker commented Mar 22, 2021

FWIW, I ran into this issue with a typed array doc block:

/**
 * @var array<array{min: string, max: string|null, increment: string}>
 *
 * @ORM\Column(type="json")
 */
public array $bidding_table = [];

@Gonzalo1987
Copy link

Same problem...

The solution could be add object as primitive type?

    private function isPrimitiveType(string $type): bool
    {
-        return in_array($type, ['int', 'float', 'bool', 'string']);
+        return in_array($type, ['int', 'float', 'bool', 'string', 'object']); 
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants