簡體   English   中英

Spring 3.0 + REST Web服務+ JSON + XML

[英]Spring 3.0 + REST web service + json + xml

我現在已經嘗試了很多事情,並在很多地方查找了此問題。

我正在嘗試使用Spring MVC 3.0進行Rest Web服務調用,以JSON和XML的形式獲取數據。 據我所知,當類路徑中存在傑克遜核心和映射器jar時,Spring會自動將響應轉換為jSon。 這將在項目中按預期工作。

我正在努力的是生成xml響應。 我不確定該怎么做。 我嘗試了各種方法來設置生成xml響應的方法。 根據我的理解,jdk 6及更高版本具有JAXB實現。 因此,當我用XML注釋對POJO進行注釋以生成XML時,它應該給我一個XML響應。 但是由於某種原因,它一直給我JSON響應。 有任何想法嗎? 以下是我的POJO,它具有XMLRootElement jaxb批注。

    package my.dto;

    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement(name = "mydto")
    public class MyDTO {

        String name;
        Long quantity;
        String type;


        public String getName() {
            return name;
        }
        @XmlElement
        public void setName(String name) {
            this.name = name;
        }


        public String getType() {
            return type;
        }
        @XmlElement
        public void setType(String type) {
            this.type = type;
        }


        public Long getQuantity() {
            return quantity;
        }
        @XmlElement
        public void setQuantity(Long quantity) {
            this.quantity = quantity;
        }

        public MyDTO(String name, Long quantity) {
            this.name = name;
            this.quantity = quantity;
        }

        public MyDTO() {
            super();
        }

    }

**My Controller:**

package my.package;

import java.util.ArrayList;
import java.util.List;

import my.dto.MyDTO;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;


@Controller
@RequestMapping("/spring")
public class MyController {



    @RequestMapping(value="{b}", method = RequestMethod.GET)
    @Produces("application/xml")
    public @ResponseBody List<MyDTO> getMyList(@PathVariable String b) {


        MyDTO m1 = new MyDTO("My 1", Long.valueOf(100));
        MyDTO m2 = new MyDTO("My 2", Long.valueOf(200));

        List<MyDTO> list = new ArrayList<MyDTO>();
        list.add(m1);
        list.add(m2);

        return list;
    }

}

一:

是的 ,您需要@XML批注,但是它們必須位於在setter上定義的getter中 ,這是錯誤的。

第二

您正在返回一個集合,對於XML來說有點不同,您需要創建以下內容

@XmlRootElement(name="list")
public class JaxbMyDTOList {

    private List<MyDTO> list;

    public JaxbMyDTOList(){}

    public JaxbMyDTOList(List<MyDTO> list){
        this.list=list;
    }

    @XmlElement(name="item")
    public List<MyDTO> getList(){
        return list;
    }
}

三:

更改自:

@RequestMapping(value="{b}", method = RequestMethod.GET)
@Produces("application/xml")
public @ResponseBody List<MyDTO> getMyList(@PathVariable String b) {

@RequestMapping(value="{b}", 
                method = RequestMethod.GET, 
                produces=MediaType.APPLICATION_XML_VALUE)
public @ResponseBody JaxbMyDTOList getMyList(@PathVariable String b) {

注意:

  • @Produces("application/xml")已刪除,並由produces=MediaType.APPLICATION_XML_VALUE)代替
  • List<MyDTO>替換為JaxbMyDTOList

四:

我建議您創建其他@RequestMapping方法,一個用於JSON,另一個用於處理XML。

暫無
暫無

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

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