JMS 反序列化不适用于排除策略
Posted
技术标签:
【中文标题】JMS 反序列化不适用于排除策略【英文标题】:JMS Deserializing is not working with exclusion policy 【发布时间】:2019-04-20 05:47:08 【问题描述】:我正在开发一个 Symfony 应用程序,并且我有一个用户实体:
/** * @ORM\实体 * @ORM\Table(name="用户") * @Serializer\ExclusionPolicy("全部") */ 类用户 /** * @ORM\ID * @ORM\Column(type="整数") * @ORM\GeneratedValue(strategy="AUTO") * * @Serializer\Expose() */ 私人 $id; /** * @var 字符串 $email * * @ORM\Column(name="email", type="string", length=255, unique=true) * @Assert\NotBlank() * @Assert\Email() * @Serializer\Expose() */ 私人$电子邮件; /** * @ORM\Column(type="string", length=64) * @Assert\NotBlank() */ 私人$密码;我正在尝试将请求负载反序列化到我的实体,如下所示:
$data = $this->request->request->all();
$jsonContent = $this->serializer->serialize($data, 'json'); // serializing goes fine
dump($jsonContent);
"email":"John.Doe@domain.com",
"password":"123"
$object = $this->serializer->deserialize($jsonContent, User::class, 'json');
dump($object); // I'm getting null values
AppBundle\Entity\User
-id: null
-email: null
-password: null
所以当我尝试使用验证器验证我的对象时:
$errors = $this->validator->validate($object);
验证失败并显示此响应:
"errors" :
"email": "This value should not be blank.",
"password": "This value should not be blank."
但是,当我删除这一行 @Serializer\ExclusionPolicy("all")
时,一切正常。
我正在使用:
Symfony 3.4 jms/serializer-bundle 2.3我该如何解决这个问题?
【问题讨论】:
您能否发布在 \JMS\Serializer\Metadata\Driver\AnnotationDriver::loadMetadataForClass 中返回的类元数据的转储 我怎样才能得到它? @AlexandruCosoi 进入课堂,然后返回 $classMetadata;放一个 error_log((json_encode($classMetadata)). 并检查 error_log 后获取 json 元数据 【参考方案1】:另一种方法是使用如下形式:
用户类型
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class UserType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options)
$builder
->add('email')
->add('password')
;
public function configureOptions(OptionsResolver $resolver)
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\User'
));
?>
在您的控制器中,您可以拥有:
class UserController extends Controller
/**
* @Route("/api/users", name="api_users_post_something")
* @Method("POST")
*/
public function postSomethingAction(Request $request)
$data = $this->serializer->deserialize($request->getContent(), 'array', 'json');
$user = new User();
$form = $this->createForm(UserType::class, $user, ['csrf_protection' => false]); // disable csrf_protection if you are making api
$form->submit($data);
if(!($form->isSubmitted() && $form->isValid()))
// Send form errors
// Persist and flush or do what you want to do
?>
这只是通过使用表单处理和使用表单验证的示例尝试。 希望对您有所帮助。
【讨论】:
以上是关于JMS 反序列化不适用于排除策略的主要内容,如果未能解决你的问题,请参考以下文章
从 XML 文档创建的 Json 反序列化到 POCO 不适用于数组
使用“key”和“value”属性反序列化JSON映射不适用于Jackson