2017-05-08 3 views
1

enter image description here私はXMLレスポンスをXML要求を受け取り、生産安らかなWebサービスを作成しようとしていると私はそれのために春4.3.5を使用しています...春4 RestControllerマップしないXML要求が正しく

問題があるときに私はPOSTMANを使ってポストリクエストをポストしており、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

私が間違っている場合は、私が考える正しいアドオンはご使用のコントローラ –

+0

に= { \t \t \t MediaType.APPLICATION_XML_VALUE}を生成し、uは、アプリケーションのcontext.xmlファイル –

+0

にPOJOおよびその逆にXMLを変換するための設定Beanを持っていますスプリング4ではコンバーターを追加する必要はありません。そしてそのXMLを正しく生成していますが、それをテストしましたが、ポストボディのxml文字列を "Playter playter"にマッピングしている場合 –

答えて

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

リクエスト処理方法です(ここでは@RequestMappingの注釈は省略しています)。このメソッドを使用すると、オブジェクトへのパラメータのバインドを行うことができます。したがって、URL /player/?id=2&name=fooを渡す場合、idフィールドの値は2nameのフィールド値はfooになります。

ただし、メッセージ変換を行いたいバインディングはしたくないです。これを有効にするには、メソッド引数に@RequestBodyという注釈を付ける必要があります。これはSpring MVCにuseパラメータバインディングではなく、適切なHttpMessageConverterを検出してHTTPメッセージ本文をPlayerインスタンスに変換しようとします。

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

上記の署名が問題を解決するはずです。これを非常にうまく説明しているreference guideも参照してください。

注:@RestControllerはそれが@RequestBodyを推測することはありません@Controller@ResponseBodyの組み合わせです。 reference guideを参照してください。

+0

ありがとう、@ M.Deinumそれは私のために働いています(Y):) –

関連する問題