【问题标题】:FOSElastica + JMs serializer malformed dataFOSElastica + JMs 序列化器格式错误的数据
【发布时间】:2018-05-04 16:14:11
【问题描述】:

我使用他们的 Docker 映像安装了 ElasticSearch 6,一切正常。

然后我按照文档中的说明安装并配置了 FOSElastica。

这是 fos_elastica 的以下配置

fos_elastica:
    clients:
        default: { host: '%env(ELASTICSEARCH_HOST)%', port: '%env(ELASTICSEARCH_PORT)%' }
    serializer:
        serializer: jms_serializer
    indexes:
        app:
            client: default
            types:
                user:
                    serializer:
                        groups: [elastica]
                    persistence:
                        driver: orm
                        model: AppBundle\Entity\User
                        provider: ~
                        listener: ~
                        finder: ~

我的用户实体模型将elastica序列化器组分配给某个字段

AppBundle\Entity\User:
    exclusion_policy: ALL
    properties:
        firstname:
            expose: true
            groups: [elastica, list, details]
        lastname:
            expose: true
            groups: [elastica, list, details]
        locale:
            expose: true
            groups: [elastica, details]

序列化程序在我的 API 上运行良好并且配置良好

 jms_serializer:
    metadata:
        auto_detection: true
        directories:
            AppBundle:
                namespace_prefix: 'AppBundle'
                path: '%kernel.project_dir%/config/serializer'

当我尝试填充 ElasticSearch 时,我认为这是一个严重的序列化错误

In Http.php line 181:

[Elastica\Exception\ResponseException]                                              
Malformed action/metadata line [3], expected START_OBJECT but found [VALUE_STRING]

我尝试在 fos_elastica 配置中使用 properties.type 配置设置字段类型,但没有成功。

我尝试了另一个实体,但我得到了同样的错误。

我已经在大约 1 年前与 FOSElasticaBundle 合作过同一个项目,并且人口正在工作......

如果有 JMSSerializer/FOSElastica 错误或配置错误,我没有成功找到问题所在

我是否遗漏了配置中的某些内容?你已经有这个问题了吗?

【问题讨论】:

  • 兄弟有什么解决办法吗?
  • 这个错误是由于 JSON_PRETTY_PRINT 造成的,并且与 symfony 序列化程序完全相同。删除它,它应该可以工作
  • Grezat 解决了,谢谢你 ^^

标签: php symfony elasticsearch serialization


【解决方案1】:

我遇到了类似的问题。这是原始的弹性配置(给出了这个错误)。

fos_elastica:
clients:
    default: { host: '%env(ELASTICSEARCH_HOST)%', port: '%env(ELASTICSEARCH_PORT)%' }
serializer:
    serializer: jms_serializer
indexes:
    app:
        finder: ~
        types:
            goods:
                properties:
                    name: { type: text }
                    brand: { type: text }
                    cost: { type: float }
                    category:
                        type: "object"
                        properties:
                          id: ~
                          name: ~
                    goodsDescriptions:
                        type: "object"
                        properties:
                          id: ~
                          name: ~
                          description: ~
                persistence:
                    driver: orm
                    model: App\Entity\Goods\Goods
                    provider: ~
                    finder: ~
                    repository: App\SearchRepository\GoodsRepository

但是,我在厂商foselastic里面爬了很久,发现添加它的数据是基于jms_serializer,这很明显,但当时我不这么认为。通过删除此序列化并且它起作用了。 我们有不同的设置,但也许它会给你一个想法。

【讨论】:

  • 是的,我也试过不使用序列化程序,它运行良好。但在我看来,直接在实体内部定义字段更简单更好。这就是我问这个问题的原因。仅供参考,我在他们的 GitHub 存储库上打开了一个关于此的问题:github.com/FriendsOfSymfony/FOSElasticaBundle/issues/1438
【解决方案2】:

为避免此错误,只需删除

JSON_PRETTY_PRINT

来自您的 JMS/Symfony 序列化器配置。

【讨论】:

    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多