我正在使用Doctrine2和JMS Serializer,但序列化程序抛出了一个奇怪的错误:
AnnotationException:[语义错误]类“Doctrine \ ORM \ Mapping \ PrePersist”未使用@Annotation注释。你确定这个类可以用作注释吗?如果是这样,那么您需要将@Annotation添加到“Doctrine \ ORM \ Mapping \ PrePersist”的 class doc注释中。如果确实没有注释,那么您需要将@IgnoreAnnotation(“ORM \ PrePersist”)添加到方法User \ User :: prePersist()的类 doc注释中。
当我尝试序列化实体对象时会发生这种情况。这些是实体类的相关位:
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
进行了注释。所以这个bug似乎是在JMS方面,而不是Doctrine2。
导致这种情况的原因是什么?
注意:在这种情况下,正确的标签是'jmsserializer',而不是'jmsserializerbundle'。有人请在适当的时候创建它和/或删除此注释。
答案 0 :(得分: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;
}
// ...
}