Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java springmvc:作为参数的复杂对象_Java_Spring_Spring Mvc_Spring Boot - Fatal编程技术网

Java springmvc:作为参数的复杂对象

Java springmvc:作为参数的复杂对象,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,我开始学习SpringBoot,我面临着很多问题。我有以下代码: @RestController public class UserController { @RequestMapping("/") public String getMessageInfo(Message message) { return "Id is " + message.getId() + ", message is " + message.getMessage() + ", param

我开始学习SpringBoot,我面临着很多问题。我有以下代码:

@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的操作时,它不会被忽略。你能解释一下是什么问题吗


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

您可以这样使用

    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);
MultiValueMap参数=新链接的MultiValueMap();
参数添加(“id”,1);
参数添加(“良好”,正确);
参数添加(“消息”,1234);
HttpHeaders requestHeaders=新的HttpHeaders();
requestHeaders.setContentType(MediaType.MULTIPART\u FORM\u数据);
HttpEntity requestEntity=新的HttpEntity(参数、RequestHeader);
RestTemplate RestTemplate=新RestTemplate();
Message=restTemplate.postForObject(“http://localhost:8080/“,requestEntity,Message.class);

我解决了这个问题,如果像这样添加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();
}

所有参数都不会被忽略

因为您正试图处理复杂对象,所以从post请求中接受您的对象

@RequestMapping("/",method=RequestMethod.POST)
public String getMessageInfo(@RequestBody Message message) {
    return message;
} 
在上面的代码中,我将
method
属性设置为
POST
,然后当您发出
POST
请求时,它将被调用,并且我在方法
参数中使用
@RequestBody Message Message
。它将从传入的
请求
转换并形成一个
消息对象
,如果您不放置
@requestBody
注释,那么spring将
注入一个Bean
,而不是从请求形成一个Bean

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

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

在发出请求时,请创建一个
消息对象
设置其中的每个字段,否则您将导致
错误请求
错误。

如果不是输入错误,您将丢失注释RequestParam或ModelAttribute?我编写了
getMessageInfo(@ModelAttribute(“Message”)消息)
但没有任何更改。Spring将始终调用默认构造函数,并为参数使用可用的setter。因为您没有这些,所以请求中不会传递任何内容。绑定仅适用于符合java bean规范的类。问题仍然是,
int
boolean
参数仍具有默认值。在消息中,将int更改为整数,将boolean更改为boolean,然后重试。getMessageInfo()的返回类型应为Message