1

我正在使用 Doctrine2 和JMS Serializer,但是序列化程序抛出了一个奇怪的错误:

AnnotationException:[Semantical Error] 类“Doctrine\ORM\Mapping\PrePersist”未使用@Annotation 进行注释。你确定这个类可以用作注释吗?如果是这样,那么您需要在“Doctrine\ORM\Mapping\PrePersist”的类文档注释中添加@Annotation。如果确实没有注解,则需要在方法User\User::prePersist()的类文档注释中添加@IgnoreAnnotation("ORM\PrePersist")。

当我尝试序列化实体对象时会发生这种情况。这些是实体类的相关位:

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;

/**
 * @ORM\Entity
 * @ORM\Table(name="products", indexes={
 *     @ORM\Index(columns={"price"}),
 * })
 * @ORM\HasLifecycleCallbacks
 */
class Product
{
    // ...

    /**
     * @ORM\PrePersist
     */
    public function prePersist()
    {
        $this->createdAt = new \DateTime;
        $this->updatedAt = $this->createdAt;
    }

    // ...
}

我打开Doctrine\ORM\Mapping\PrePersist@Annotation. 所以这个错误似乎在 JMS 方面,而不是在 Doctrine2 方面。

这可能是什么原因造成的?

注意:在这种情况下,正确的标签应该是“jmsserializer”,而不是“jmsserializerbundle”。如果合适,请有人创建它和/或删除此注释。

4

1 回答 1

0

你混淆了两件事:Doctrine 和 JMSSerializer。

您应该准确地告诉 JMSSerializer 您想要序列化什么。因此,请尝试排除所有并注释您想要序列化的所有内容。像那样:

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;

/**
 * @ORM\Entity
 * @ORM\Table(name="products", indexes={
 *     @ORM\Index(columns={"price"}),
 * })
 * @ORM\HasLifecycleCallbacks
 * @JMS\ExclusionPolicy("all")
 */
class Product
{
    
    /**
     * @var string
     *
     * @ORM\Column(name="serializableProperty1", type="guid")
     *
     * @JMS\Expose
     */
    private $serializableProperty1;

    /**
     * @ORM\PrePersist
     */
    public function prePersist()
    {
        $this->createdAt = new \DateTime;
        $this->updatedAt = $this->createdAt;
    }

    // ...
}

于 2020-12-10T10:55:49.420 回答