2016-08-18 11 views
4

私はスプリングブートを学び始めました。私は問題に直面しています。 idSpring MVC:パラメータとしての複合オブジェクト

RestTemplate request = new RestTemplate(); 
String info = request.getForObject("http://localhost:8080/?id=4", String.class); 

値は無視されます。私はこのような何かをしようとすると、

public class Message { 
    private String message; 
    private int id; 
    private boolean good; 

    public Message() {} 

    public Message(int id) {this.id = id;} 

    public Message(String message) {this.message = message;} 

    public Message(boolean good) {this.good = good;} 

    public Message(String message, boolean good, int id) { 
     this.message = message; 
     this.good = good; 
     this.id = id; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public int getId() { 
     return id; 
    } 

    public boolean isGood() { 
     return good; 
    } 
} 

そして:

@RestController 
public class UserController { 

    @RequestMapping("/") 
    public String getMessageInfo(Message message) { 
     return "Id is " + message.getId() + ", message is " + message.getMessage() + ", parameter good is " + message.isGood(); 
    } 
} 

クラスのメッセージ:私は、コードを次のようしています。 boolean goodパラメータ(たとえば、localhost:8080/?good=true)でリクエストを送信すると、同じ問題が発生します。 Message(boolean)/Message(int)ではなく、デフォルトのコンストラクタと呼ばれます。しかし、私がlocalhost:8080/?message=1234のようなことをすると無視されません。あなたは何が問題なのか説明できますか?

そして、もう一つ質問:私はlocalhost:8080/?message=1234&good=true&id=145とは異なる方法でgetMessageInfoにクラスMessageのインスタンスを送ることができますか?私は3つ以上のパラメータがある場合?たとえば、クラスMessageに100個のパラメータがあるとしますか?あなたはこのように使用することができます

+1

注釈RequestParamまたはModelAttributeが入力ミスでない場合、その注釈がありません。 –

+0

'getMessageInfo(@ModelAttribute(" message ")メッセージメッセージ)'を書きましたが、何も変わりませんでした。 – Anna

+1

Springは常にデフォルトコンストラクタを呼び出し、パラメータには利用可能なセッタを使用します。あなたはそれらを持っていないので、何も要求から渡されることはありません。バインディングは、Java Beanの仕様に準拠したクラスでのみ動作します。 –

答えて

1

複雑なオブジェクトを処理しようとしているので、投稿要求からオブジェクトを受け入れます。上記のコードで

@RequestMapping("/",method=RequestMethod.POST) 
public String getMessageInfo(@RequestBody Message message) { 
    return message; 
} 

私はあなたがPOST要求を行っている、と私は方法parameter@RequestBody Message messageを使用していたときに、それが呼び出されますPOSTmethod属性を設定しています。あなたが@requestBodyアノテーションを入れないと、からMessage objectを変換して形成します。要求から1を形成するのではなく、スプリングでメソッドにinjectedを追加します。

あなたはそうあなたがBad requestエラーを持つに終わるだろう、その中にそれぞれすべてのフィールドを設定Message objectを作成する要求を行う際に要求

final String uri = "http://localhost:8080/"; 

    Message message = new Message(1, "Adam",true); 

    RestTemplate restTemplate = new RestTemplate(); 
    Message result = restTemplate.postForObject(uri, message, Message.class); 

を作るために、このコードを試すことができます。

0

次のようになめらかを追加した場合、

MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>(); 
    params.add("id", 1); 
    params.add("good", true); 
    params.add("message", 1234); 
    HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA); 
    HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, requestHeaders); 


    RestTemplate restTemplate = new RestTemplate(); 
    Message message= restTemplate.postForObject("http://localhost:8080/", requestEntity, Message.class); 
+0

問題は同じですが、 'int'および' boolean'パラメータは依然としてデフォルト値のままです。 – Anna

+0

**メッセージ**整数を整数に変更し、ブール値をブール値に変更して試してください。 –

1

私は、この問題を解決:

@ModelAttribute("message") 
    public Message getMessage(String message, boolean good, int id){ 
    return new Message(message, good, id); 
} 

@RequestMapping("/") 
public String getUserInfo(@ModelAttribute("message") Message message) { 
    return "Id is " + message.getId() + ", message is " + message.getMessage() + ", parameter good is " + message.isGood(); 
} 

すべてのパラメータが無視されていません。

関連する問題