簡體   English   中英

如何在 Spring Boot Rest API 中以 XML 形式返回對象列表

[英]How to return a list of objects as XML in Spring boot rest API

我正在編寫一個 Java 網絡服務,它將以下面的 XML 格式返回產品列表。

    <?xml version="1.0"?>
    
    <Products>
    <Product>
        <Name>Notepad++ 6</Name>
        <PatchUid>00038b09-0000-0000-0000-000000000000</PatchUid>
        <RegID>0</RegID>
    </Product>
    <Product>
        <Name>UltraVNC 1.2.4.0 x86</Name>   
        <PatchUid>00035767-0000-0000-0000-000000000000</PatchUid>
        <RegID>0</RegID>
    </Product>
    <Product>
        <Name>FileZilla 3</Name>    
        <PatchUid>00038c69-0000-0000-0000-000000000000</PatchUid>
        <RegID>1033</RegID>
    </Product>
    </Products>

我正在使用如下所示的基於類的投影從 jdbc/hibernate 連接中獲取 Name、PatchUid、RegId 標簽。

public class ProductView implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonProperty("Name")
    String name;
    @JsonProperty("PatchUid")
    String patchuid;
    @JsonProperty("RegId")
    String language;

    public ProductView() {
        super();
        // TODO Auto-generated constructor stub
    }

    public ProductView(String name, String patchuid, String language) {
        this.name = name;
        this.patchuid = patchuid;
        this.language = language;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPatchuid() {
        return patchuid;
    }

    public void setPatchuid(String patchuid) {
        this.patchuid = patchuid;
    }

    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

}

現在,為了返回 XML 響應,我使用下面的 DTO 類和其余控制器方法

    public class Products implements Serializable {
        
        private static final long serialVersionUID = 3639898896768313168L;
        
        
        private List<ProductView> products;
    
        public Products() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        public Products(List<ProductView> products) {
            this.products = products;
        }
    
        public List<ProductView> getProduct() {
            return products;
        }
    
        public void setProduct(List<ProductView> products) {
    
            this.products = products;
        }
    
    }
    
    
    @GetMapping("/patchMetadata")
    public Products getProductMetadata(@RequestParam(required=false) Boolean filtered) {
            
            logger.info("getProductMetadata called");
    
            List<ProductView> prodViews = null;
            
            if(filtered == null || filtered == false)
            {
                prodViews = prodMgmtService.findAllPatches();
            }
            else if (filtered == true) {
                prodViews = prodMgmtService.findFilteredPatches();
            } 
    
            Products products = new Products();
            products.setProduct(prodViews);
    
            return products;
    }

但返回的 XML 格式如下所示。 請注意需要刪除的額外產品標簽。

    <Products>
        <product>
            <product>
                <Name>FileZilla 3</Name>
                <PatchUid>0003931b-0000-0000-0000-000000000000</PatchUid>
                <RegId>0</RegId>
            </product>
            <product>
                <Name>Notepad++ 6</Name>
                <PatchUid>00038b09-0000-0000-0000-000000000000</PatchUid>
                <RegId>0</RegId>
            </product>
            <product>
                <Name>UltraVNC 1.2.4.0 x86</Name>
                <PatchUid>00035767-0000-0000-0000-000000000000</PatchUid>
                <RegId>0</RegId>
            </product>
        </product>
    </Products>

請讓我知道任何建議以糾正從網絡服務返回的 XML 格式。

返回List<ProductView> ,而不是從您的服務中返回Products

@GetMapping("/patchMetadata")
public List<ProductView> getProductMetadata(@RequestParam(required=false) Boolean filtered) {
    List<ProductView> prodViews = null;
    if(filtered == null || filtered == false) {
        prodViews = prodMgmtService.findAllPatches();
    } else if (filtered == true) {
        prodViews = prodMgmtService.findFilteredPatches();
    } 

    return prodViews;
}

使用 @JacksonXmlElementWrapper(useWrapping = false) 更改 Products DTO 類,如下所示。

公共類產品實現可序列化{

    private static final long serialVersionUID = 3639898896768313168L;
    
    @JacksonXmlElementWrapper(useWrapping = false)
    @JsonProperty("Product")
    private List<ProductView> product;

    public Products() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Products(List<ProductView> products) {
        this.product = products;
    }

    public List<ProductView> getProduct() {
        return product;
    }

    public void setProduct(List<ProductView> products) {

        this.product = products;
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM