Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 3.0+;RESTWeb服务&x2B;json+;xml_Xml_Json_Spring_Spring Mvc_Jaxb - Fatal编程技术网

Spring 3.0+;RESTWeb服务&x2B;json+;xml

Spring 3.0+;RESTWeb服务&x2B;json+;xml,xml,json,spring,spring-mvc,jaxb,Xml,Json,Spring,Spring Mvc,Jaxb,我现在已经尝试了很多方法,并且查找了很多关于这个问题的地方 我尝试使用SpringMVC3.0进行RESTWeb服务调用,以获取JSON和XML格式的数据。据我所知,当jackson core和mapper JAR出现在类路径中时,Spring会自动将响应转换为jSon,这很好。这与项目中的预期一样有效 我正在努力的是生成一个xml响应。我不知道我必须为此做些什么。我尝试了各种方法来设置生成xml响应的方法。据我所知,jdk 6及以上版本都有JAXB实现。因此,当我用XML注释对POJO进行注释

我现在已经尝试了很多方法,并且查找了很多关于这个问题的地方

我尝试使用SpringMVC3.0进行RESTWeb服务调用,以获取JSON和XML格式的数据。据我所知,当jackson core和mapper 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;
    }

}
将my.dto打包;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name=“mydto”)
公共类MyDTO{
字符串名;
数量多;
字符串类型;
公共字符串getName(){
返回名称;
}
@XmlElement
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getType(){
返回类型;
}
@XmlElement
公共void集合类型(字符串类型){
this.type=type;
}
公共长getQuantity(){
退货数量;
}
@XmlElement
公共无效设置数量(长数量){
这个。数量=数量;
}
公共MyDTO(字符串名称,长数量){
this.name=名称;
这个。数量=数量;
}
公共MyDTO(){
超级();
}
}
**我的控制器:**
包我的包;
导入java.util.ArrayList;
导入java.util.List;
导入my.dto.MyDTO;
导入org.springframework.stereotype.Controller;
导入org.springframework.web.bind.annotation.PathVariable;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RequestMethod;
导入org.springframework.web.bind.annotation.ResponseBody;
导入javax.ws.rs.products;
导入javax.ws.rs.core.MediaType;
@控制器
@请求映射(“/spring”)
公共类MyController{
@RequestMapping(value=“{b}”,method=RequestMethod.GET)
@生成(“应用程序/xml”)
public@ResponseBody List getMyList(@PathVariable字符串b){
MyDTO m1=新MyDTO(“My 1”,长数值为(100));
MyDTO m2=新MyDTO(“My 2”,长数值为(200));
列表=新的ArrayList();
增加(m1);
列表。添加(m2);
退货清单;
}
}
一个:

,您需要
@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;
    }
}
注意:

  • @products(“application/xml”)
    被删除并替换为
    products=MediaType.application\u xml\u VALUE)
  • List
    替换为
    JaxbMyDTOList
四个:


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

当我将@products(“application/XML”)删除并替换为products=MediaType.application\u XML\u VALUE)时,出现一个错误代码,它表示“注释类型RequestMapping的属性products未定义”。Spring3是否与@RequestMapping一起具有此属性?事实上,我以前也尝试过这个方法,后来当我遇到eclipse编译时错误时将其删除。非常感谢!猜猜看,这是怎么回事,我没有更改@RequestMapping的注释,尽管我在前面的评论中指出了错误。我认为问题出在二传手身上,就像你正确指出的那样。建议4的最后一件事是创建了两个方法,一个用于JSON,一个用于XML。如何使用webservice url调用正确的方法?如果我有两个方法,那么如何从http URL调用每个方法,这与Spring 3的
生成属性的
@RequestMapping
有关。我很早以前就在为Spring 4工作。。明确说明您使用的是哪个Spring3版本?我想检查API以确认您关于XML和JSON的问题,通常我为每个
@RequestMapping
使用两个URL,例如
value=“/{b}/XML”
value=“/{b}/JSON”
感谢您的回复。我正在为spring使用3.0.6.RELEASE.jars。我将尝试使用两个URL调用不同的方法(JSON和XML)。
@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) {