2017-05-08 52 views
1

enter image description here我試圖做一個RESTful Web服務是採用XML請求,併產生XML響應,我使用彈簧4.3.5它...彈簧4 RestController不映射XML請求正確

的問題是,當我使用postman發佈了一個post請求,並且在我的服務方法中添加了一個調試,這比我發現xml請求屬性沒有使用播放器POJO進行映射/反序列化。

任何幫助將是appreciated..Thanks

@RestController 
public class SyncRestfulService { 

LoggerManager loggerManager = new LoggerManager(); 

@RequestMapping(value = RestURIConstants.SAMPLE_POST_PLAYER, method = RequestMethod.POST, headers = { 
     "Content-type=application/xml" }) 
public Player getPlayer(Player requestEntity) { 

    loggerManager.info(LoggerConstantEnum.SyncRestfulService , 
      "| <AbilitySyncRestfulService> Method: getPlayer " + requestEntity); 

    loggerManager.info(LoggerConstantEnum.SyncRestfulService , "Id : ", requestEntity.getId()); 

    return requestEntity; 
} 

}

請求XML數據

//Request 
<player> 
    <id>1</id> 
    <matches>251</matches> 
    <name>Anand</name> 
</player> 

//response xml data 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<player> 
    <id>0</id> 
</player> 

// JAXB POJO

@XmlRootElement(name = "player") 
@XmlAccessorType(XmlAccessType.NONE) 
public class Player { 

    private int id; 

    private String name; 

    private String matches; 

    public int getId() { 
     return id; 
    } 
    @XmlElement(name = "id") 
    public void setId(int id) { 
     this.id = id; 
    } 

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

    public String getMatches() { 
     return matches; 
    } 
    @XmlElement(name = "matches") 
    public void setMatches(String matches) { 
     this.matches = matches; 
    } 
} 
+0

附加產生= { \t \t \t MediaType.APPLICATION_XML_VALUE}在你的控制器 –

+0

,做u有配置豆到XML轉換成POJO,反之亦然應用-context.xml文件 –

+0

正確的,如果我錯了,我想在春天4我們不需要添加轉換器。和它的正確生產XML我已經測試過,但在案件問題是映射後身體XML字符串到「Playter playter」 –

回答

2
public Player getPlayer(Player requestEntity) { ... } 

這是您的請求處理方法(在此省略@RequestMapping註釋)。用這種方法你可以做參數綁定到對象。因此,如果您通過URL /player/?id=2&name=foo,則id字段將獲得值2name字段值foo

但是你不想做綁定你想做消息轉換。爲了啓用這個方法參數,必須使用@RequestBody進行註釋,這將告訴Spring MVC不使用參數綁定,但是嘗試並檢測合適的HttpMessageConverter以將HTTP消息主體轉換爲Player實例。

public Player getPlayer(@RequestBody Player requestEntity) { ... } 

上面的簽名應該可以解決您的問題。另請參閱reference guide,這很好地解釋了這一點。

注:@RestController@Controller@ResponseBody組合並不推斷@RequestBody。請參閱reference guide

+0

謝謝,@ M.Deinum它的工作對我來說(Y):) –