Spring boot REST API 返回列表/数组格式问题 [英] Spring boot REST API Returning a List/Array Formatting issue

查看:118
本文介绍了Spring boot REST API 返回列表/数组格式问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发基于 Spring Boot 的 Web 服务 API.我需要为 GET 响应返回一个事物列表 (ProductData).

I am developing spring boot based web services API. I need to return a list of things (ProductData) for the GET response.

这是响应的样子

<ProductDataList>
  <ProductData>
     <ProductData>...</ProductData>
     <ProductData>...</ProductData>
     <ProductData>...</ProductData>
  </ProductData>
</ProductDataList>

但我不需要额外的 标签.我需要如下回复.

But I don't need the extra <ProductData> tag. I need the response as below.

  <ProductDataList>
    <ProductData>...</ProductData>
    <ProductData>...</ProductData>
    <ProductData>...</ProductData>
  </ProductDataList>

知道为什么会生成额外的标签吗?

Any idea why an extra tag is generated?

我的 WebMvcConfig 文件中有以下内容.

I have below in my WebMvcConfig file.

  @Bean
public MappingJackson2XmlHttpMessageConverter xmlConverter() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.propertyNamingStrategy(PropertyNamingStrategy.
            PascalCaseStrategy.PASCAL_CASE_TO_CAMEL_CASE);
    builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
    builder.failOnUnknownProperties(false);
    MappingJackson2XmlHttpMessageConverter xmlConverter =
            new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build());
    return xmlConverter;
}

在我的控制器中我有

@RequestMapping(value = "/productdata")
@ResponseBody
public ProductDataList getProductData(@RequestParam final String[] ids) {        
    ArrayList<ProductData> products = productDataService.getProductData(ids);

    ProductData[] pdArray = new ProductData[products.size()];
    products.toArray(pdArray);
    ProductDataList productDataList = new ProductDataList();
    productDataList.setProductData(pdArray);

    return productDataList;
}

这是我的 ProductDataList 类.

This is my ProductDataList class.

public class ProductDataList{

     ProductData[] productData;

     public ProductData[] getProductData() {
           return productData;
     }

     public void setProductData(ProductData[] productData) {
           this.productData = productData;
     }
}

<小时>

编辑 1.

当我返回 ArrayList 时,响应是这样的.

When I return ArrayList<ProductData> the response was like this.

<ArrayList>
  <item>...</item>
  <item>...</item>
  <item>...</item>
</ArrayList>

编辑 2.添加注释 JsonTypeInfo 后,我取得了一些进展,但还没有达到我想要的.

Edit 2. After adding annotation JsonTypeInfo I made some progress, but not quite there to what I wanted.

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
public class ProductData {}

<ProductDataList>
     <item _type="ProductData">...</item>
     <item _type="ProductData">...</item>
     <item _type="ProductData">...</item>
<ProductDataList>

推荐答案

经过一番努力,我终于解决了这个问题.关键是在对象中有 @JacksonXmlElementWrapper(useWrapping = false) 如上所述 在这个答案中

After some effort I was able to get this resolved. Key thing is to have @JacksonXmlElementWrapper(useWrapping = false) in the Object as mentioned in this answer

@JacksonXmlRootElement(localName = "ProductDataList")
public class ProductDataList {

    @JacksonXmlProperty(localName = "ProductData")
    @JacksonXmlElementWrapper(useWrapping = false)
    ProductData[] productDataArray = null;

    public ProductData[] getProductDataArray() {
        return productDataArray;
    }

    public void setProductDataArray(ProductData[] productDataArray) {
        this.productDataArray = productDataArray;
    }
}

现在响应看起来就像我想要的那样.

Now the response looks like just as I wanted to be.

<ProductDataList>
    <ProductData>...</ProductData>
    <ProductData>...</ProductData>
    <ProductData>...</ProductData>
</ProductDataList>

这篇关于Spring boot REST API 返回列表/数组格式问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆