2014-10-30 197 views
1

我已经尝试了很多东西,并且为这个问题查找了很多地方。Spring 3.0 + REST web服务+ json + xml

我正在尝试使用Spring MVC 3.0进行其他Web服务调用以获取JSON和XML格式的数据。从我所理解的那一刻起,当jackson core和mapper jars出现在类路径中时,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; 
    } 

} 

回答

1

一:

,你需要的@XML注释,但必须设在干将,你已经在制定者定义的,这是错误的。

你是返回集合,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")通过JaxbMyDTOList

四更换拆卸和更换由produces=MediaType.APPLICATION_XML_VALUE)

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

  • +0

    当我移除和更换@Produces(“应用程序/ XML”)以生产= MediaType.APPLICATION_XML_VALUE),存在错误代码,并将其说“该属性产生未定义的注释类型RequestMapping”。 Spring 3是否有@RequestMapping这个属性?我其实之前也试过这个,之后我将它删除,因为我得到了eclipse编译时错误。非常感谢! – 2014-10-30 07:48:48

    +0

    猜猜看,这工作,我没有改变@RequestMapping的注释,虽然因为我得到了错误,如前面的评论中所述。我认为问题出在你说得对的指定人。建议4的最后一件事是你已经说过要创建2个方法,一个用于JSON,另一个用于XML。我如何使用webservice url调用正确的方法?如果我有2个方法,我怎样从http URL调用每个URL – 2014-10-30 07:54:13

    +0

    有趣的是@ @ RequestMapping对于Spring 3的'produce'属性有意义。我很早以前就和Spring 4一起工作。明确地说Spring 3是什么版本正在使用?我想检查API以确认您的问题 – 2014-10-30 12:41:19