【问题标题】:Spring 3.0 + REST web service + json + xmlSpring 3.0 + REST Web 服务 + json + xml
【发布时间】:2014-12-25 21:59:39
【问题描述】:

我现在已经尝试了很多东西,并为这个问题查找了很多地方。

我正在尝试使用 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 json spring spring-mvc jaxb


    【解决方案1】:

    一个:

    是的,您需要@XML 注释,但它们必须位于 getters 中,您已在 setter 上定义,这是错误的。

    第二

    您正在返回一个集合,对于 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&lt;MyDTO&gt; 替换为 JaxbMyDTOList

    四个:

    我建议你创建其他 @RequestMapping 方法,一个用于 JSON,另一个用于处理 XML

    【讨论】:

    • 当我删除 @Produces("application/xml") 并将其替换为 products=MediaType.APPLICATION_XML_VALUE) 时,出现错误代码,并显示“对于注释类型 RequestMapping,属性生成未定义” . Spring 3 是否与@RequestMapping 一起具有此属性?实际上,我之前也尝试过这个,后来因为我遇到 eclipse 编译时错误而将其删除。非常感谢!
    • 猜猜这是怎么回事,我没有更改@RequestMapping 的注释,尽管我收到了前面评论中所述的错误。我认为问题在于您正确指出的二传手。建议 4 的最后一件事是您说过创建了 2 种方法,一种用于 JSON,另一种用于 XML。如何使用 web 服务 url 调用正确的方法?如果我有 2 种方法,我如何从 http URL 调用每个方法
    • 对 Spring 3 的 produces 属性的 @RequestMapping 很感兴趣。我很久以前就在使用 Spring 4.. 明确您使用的是哪个 Spring 3 版本?我想检查 API 以确认您的问题
    • 关于 XML 和 JSON,一般我用两个 url 每个@RequestMapping,例如value="/{b}/xml"value="/{b}/json"
    • 感谢您的回复。我在春季使用 3.0.6.RELEASE.jars。我将尝试查看是否可以使用两个 url 调用不同的方法(JSON 和 XML)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2016-01-21
    • 2011-06-09
    • 2014-02-27
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多