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 不适用于数组

MVC4 webapi中的反序列化/模型绑定不适用于数组

使用“key”和“value”属性反序列化JSON映射不适用于Jackson

将 JSON 对象反序列化为 List<type> 不适用于 asmx 服务

在JMS Serializer上反序列化期间构造对象

漏洞复现|CVE-2017-7504 JBoss 4.x JBossMQ JMS 反序列化漏洞