Spring MVC:复杂对象作为参数

时间:2016-08-18 12:23:51

标签: java spring spring-mvc spring-boot

我开始学弹簧靴,我遇到了问题。我有以下代码:

@RestController
public class UserController {

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

班级留言:

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;
    }
}

当我尝试做这样的事情时:

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

忽略id的值。当我使用布尔good参数发送请求时出现相同的问题(例如localhost:8080/?good=true)。它被称为默认构造函数,而不是Message(boolean) / Message(int)。但是,当我做localhost:8080/?message=1234这样的事情时,它不会被忽略。你能解释一下我的问题是什么吗?

还有一个问题:我可以用Message以不同的方式将课程getMessageInfo的实例发送到localhost:8080/?message=1234&good=true&id=145吗?如果我有超过3个参数?例如,如果类Message有100个参数?

3 个答案:

答案 0 :(得分:1)

我解决了这个问题,如果像这样添加smth:

@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();
}

不会忽略所有参数。

答案 1 :(得分:1)

因为你正在尝试处理一个复杂的对象,所以从post请求中接受你的对象。

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

在上面的代码中我将method属性设置为POST,然后当您发出POST请求时我会调用它,并且我正在使用{{1}在方法@RequestBody Message message内。这将转换并从传入的parameter中形成Message object,如果你不放request注释,那么Bean将@requestBody通过spring而不是形成一个从请求。

您可以尝试使用此代码发出请求

injected

在发出请求时,会在其中创建 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); 设置每个字段,否则最终会出现Message object错误。

答案 2 :(得分: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);