Поведение Dozer Mapping меняется, когда я использую map-id. Вложенные массивы не отображаются! Что я делаю не так? - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время я использую Dozer для всех отображений. Я пытаюсь решить новое требование, и я решил использовать map-id для его решения.

  • Когда вызывается конечная точка / продукты, должны быть представлены только корневые поля.
  • Когда вызывается конечная точка / products / {id}, должны быть представлены все поля, включая вложенные.

Я понимаю, что у меня плохие результаты с идентификатором карты.

Итак, я спрашиваю:

  • могу ли я использовать map-id для решения своих проблем? как?
  • Есть ли другое решение? как?

/ продукты

С идентификатором карты в списке продуктов не отображается цена:

[
{
   "id": "a5f206e4",
   "name": "bike",
   "type": "MOUNTAIN",
   "description": "ddsfsdf",
   "price": null
},
...
]

Без идентификатора карты в списке продуктов указана цена:

[
{
   "id": "a5f206e4",
   "name": "bike",
   "type": "MOUNTAIN",
   "description": "ddsfsdf",
   "price": {
        "unit": "€",
        "value": 100
   }
},
...
]

/ произведения / {ID}

Когда я звоню GET / products / {id}, я делаю

 ProductDto productDto = Converter.DOZER.getMapper().map(product, ProductDto.class);

Сведения о продукте (если идентификатор карты не определен)

{
"product": {
   "id": "a5f206e4",
   "name": "bike",
   "type": "MOUNTAIN",
   "description": "ddsfsdf",
   "price": {
        "unit": "€",
        "value": 100
   }, 
   "product_groups": [
    {
        "id": "066dd1a0-",
        "name": "jjjjjjjjj",
        "type": "OWNON",
        "description": "Own",          
        "products": [
            {
                "id": "a5f206e4",
                "name": "bike",
                "type": "MOUNTAIN",
                "description": "ddsfsdf",
                "price": {
                    "unit": "€",
                    "value": 100
                },              
                 "product_groups": [
                    {
                        "id": "066dd1a0-",
                        "name": "jjjjjjjjj",
                        "type": "OWNON",
                        "description": "Own"
                    }
                ],                  
                "products": []                  
            }
        ]
    }],
    "products": [
        ....
    ]
}
}

Сведения о продукте (если определен идентификатор карты)

ProductDto productDto = Converter.DOZER.getMapper().map(product, ProductDto.class, "detail");


{
"product": {
   "id": "a5f206e4",
   "name": "bike",
   "type": "MOUNTAIN",
   "description": "ddsfsdf",
   "price": {
        "unit": "€",
        "value": 100
   }, 
   "product_groups": [
    {
        "id": "066dd1a0-",
        "name": "jjjjjjjjj",
        "type": "OWNON",
        "description": "Own",          
        "products": [
            {
                "id": "a5f206e4",
                "name": "bike",
                "type": "MOUNTAIN",
                "description": "ddsfsdf",
                "price": null,  (is not null)           
                "product_groups": null,  (is not null)              
                "products": null (is not null)
            }
        ]
    }],
    "products": [
        ....
    ]
}
}

mappings.xml

   <mapping type="one-way" map-null="true">
       <class-a>com.xxx.ProductGroup</class-a>
       <class-b>com.xxx.ProductGroupDto</class-b>
        <field>
            <a>products</a>
            <b>productList</b>
        </field>
   </mapping>      
   <mapping type="one-way" map-null="true" map-id="detail">
       <class-a>com.xxx.Product</class-a>
       <class-b>com.xxx.ProductDto</class-b>

        <field>
            <a>priceValue</a>
            <b>price.value</b>
        </field>
        <field>
            <a>priceUnit</a>
            <b>price.unit</b>
        </field>                        
        <field>
            <a>products</a>
            <b>productList</b>
        </field>
        <field>
            <a>productGroups</a>
            <b>productGroupList</b>
        </field>
   </mapping>   
   <!-- EVEN WITH THESE MAPPINGS, LIST OF PRODUCTS DOES NOT SHOW PRICE -->
   <mapping type="one-way" map-null="true" >
       <class-a>com.xxx.Product</class-a>
       <class-b>com.xxx.ProductDto</class-b>

        <field>
            <a>priceValue</a>
            <b>price.value</b>
        </field>
        <field>
            <a>priceUnit</a>
            <b>price.unit</b>
        </field>    
  </mapping>
...