Search code examples
symfonyfosrestbundlejmsserializerbundle

JMS Serializer Annotation Group not working on Entity using Symfony 4


I have been using the Group annotation for years on SF2 and SF3. I'm trying SF4.1. And I'm getting an empty JSON when I send a GET to my endpoint.

The interesting parts of my composer.json:

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

The config:

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  ] }

The Entity

use JMS\Serializer\Annotation\Groups;

class User implements UserInterface, \Serializable
{

private $id;

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

And the endpoint API Controller:

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);
 }
}

If I remove `$context->setGroups(['api']), the JSON has all the User attributes.

Any idea? Thanks!

Debug Info:

bin/console debug:container jms

Select one of the following services to display its information [fos_rest.serializer.jms]: [0] fos_rest.serializer.jms

0

Information for Service "fos_rest.serializer.jms" =================================================


Option Value


Service ID fos_rest.serializer.jms
Class FOS\RestBundle\Serializer\JMSSerializerAdapter
Tags -
Public no
Synthetic no
Lazy yes
Shared yes
Abstract no
Autowired no
Autoconfigured no



Solution

  • By default FOSRest prefers the JMSSerializer if it is installed. So first check if the service defined by the JMSSerializerBundle is defined:

    ./bin/console debug:container jms_serializer.serializer
    

    If this command displays an error message (ServiceNotFound) then the bundle is not correctly installed. Check the config/bundles.php and add the following line if it's missing:

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

    If it actually is installed, you can check the fos_rest configuration, if it maybe changes the serializer service. You can configure it like that:

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