首页 > 解决方案 > 自定义规范器未通过名称转换器服务

问题描述

我正在创建一个自定义(反)规范化器来处理实体。我创建了规范器并允许服务容器自动装配/自动配置。在反序列化期间正确选择了该服务,但我在使用名称转换器时遇到了问题。我想使用 MetadataAwareNameConverter 服务,因为我在我的实体中使用了 @SerializedName 注释。无论我做什么,它在自定义规范器中始终为空。我尝试了多种获取名称转换器服务的方法:

  1. 在我的类构造函数中明确设置它
  2. 在服务定义中设置它(有效地摆脱 autowire/autoconfig)
  3. 在 framework.yaml 中将 MetadataAwareNameConverter 设置为默认值(我发现它已经是默认值了)。
  4. 将现有的规范器复制到我的 src 中并重命名它以查看它是否获得了正确的名称转换器(它仍然不起作用)

内置规范器可以毫无问题地获得名称转换器,只是我的自定义规范器有这个问题。

还有什么我应该尝试的吗?我是否错过了设置服务的步骤?任何方向表示赞赏。

更新 - 当我转储服务容器时,参数列表中缺少名称转换器服务

---------------- ----------------------------------------------------------
  Option           Value
 ---------------- ----------------------------------------------------------
  Service ID       App\Normalizer\QNormalizer
  Class            App\Normalizer\QNormalizer
  Tags             serializer.normalizer
  Public           no
  Synthetic        no
  Lazy             no
  Shared           yes
  Abstract         no
  Autowired        yes
  Autoconfigured   yes
  Arguments        Service(serializer.mapping.class_metadata_factory)
                   -----THIS IS WHERE THE NAME CONVERTER SHOULD BE----
                   Service(property_accessor)
                   Service(property_info)
                   Service(serializer.mapping.class_discriminator_resolver)

标签: symfonyserialization

解决方案


我面临同样的问题。

就我而言,这是由于框架配置为autoconfigure服务而发生的服务配置错误(这是默认框架配置)。

结果,我在服务列表中复制了我的自定义规范器。第一个是自动配置的,没有优先级第二个由我声明并注入名称转换器:

服务编号 优先 班级名称
App\Adapter\Symfony\Serializer\Normalizer\TranslationNormalizer App\Adapter\ApiPlatform\Serializer\Normalizer\ItemNormalizer
api_platform.serializer.normalizer.item -895 App\Adapter\ApiPlatform\Serializer\Normalizer\ItemNormalizer

宣言:

api_platform.serializer.normalizer.item:
        class: App\Adapter\ApiPlatform\Serializer\Normalizer\ItemNormalizer
        arguments:
            $nameConverter: '@serializer.name_converter.metadata_aware'
        autoconfigure: false
        tags:
            - {name: serializer.normalizer, priority: -895}

由于自动配置的规范化程序在列表中具有更高的优先级 - 它是由序列化程序选择的,所以我的SerializedName注释不起作用。

解决方案是禁用首次服务的自动配置:

App\Adapter\ApiPlatform\Serializer\Normalizer\ItemNormalizer:
    autoconfigure: false

推荐阅读