JMS序列化程序注释组无法使用Symfony 4在实体上运行

时间:2018-07-07 00:39:10

标签: symfony fosrestbundle jmsserializerbundle

多年来我一直在SF2和SF3上使用组注释。 我正在尝试SF4.1。当我将GET发送到端点时,我得到的是一个空的JSON。

composer.json有趣的部分:

 "friendsofsymfony/rest-bundle": "^2.3",
 "jms/serializer-bundle": "^2.3",
 "sensio/framework-extra-bundle": "^5.1",
 "symfony/serializer-pack": "^1.0"

配置:

framework:
    serializer:
       enabled: true
       enable_annotations: true

sensio_framework_extra:
    view: { annotations: true }

fos_rest:
   routing_loader:
        default_format: json

   view:
        view_response_listener: 'force'

   format_listener:
        rules:
               - { path: ^/, prefer_extension: true, fallback_format: json, priorities: [ json,xml, html  ] }

实体

use JMS\Serializer\Annotation\Groups;

class User implements UserInterface, \Serializable
{

private $id;

/**
 * @Groups({"api"})
 */
private $username;

和端点API控制器:

use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Context\Context;
use FOS\RestBundle\View\View;

class UserController extends FOSRestController {

public function getUserAction(Request $request, EntityManagerInterface $em)
{
    $user = $em->getReference('App:User', 1);
    $view = View::create();
    $context = new Context();
    $context->setGroups(['api']);
    $view->setContext($context);
    $view->setData($user);
    return $this->handleView($view);
 }
}

如果删除`$ context-> setGroups(['api']),则JSON具有所有User属性。

有什么主意吗?谢谢!

调试信息:

bin/console debug:container jms

选择以下服务之一以显示其信息[fos_rest.serializer.jms]:   [0] fos_rest.serializer.jms

  

0

服务信息“ fos_rest.serializer.jms”  =============================================== < / p>


选项值


服务ID fos_rest.serializer.jms
  类FOS \ RestBundle \ Serializer \ JMSSerializerAdapter
  标签-
  公开
  合成编号
  懒惰的是
  共享是
  摘要编号
  自动接线没有
  自动配置否


1 个答案:

答案 0 :(得分:1)

默认情况下,FOSRest更喜欢JMSSerializer(如果已安装)。因此,首先检查是否定义了JMSSerializerBundle定义的服务:

./bin/console debug:container jms_serializer.serializer

如果此命令显示错误消息(ServiceNotFound),则表示未正确安装捆绑软件。检查config/bundles.php并添加以下行(如果缺少):

JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true],

如果实际上已安装,则可以检查fos_rest的配置(如果它可能会更改序列化程序服务)。您可以这样配置它:

fos_rest:   
    service:
        serializer: "fos_rest.serializer.jms"