Spring Boot Rest控制器未将请求主体转换为自定义对象

Ans*_*mad 1 java spring spring-data-rest spring-boot

我有使用弹簧支架控制器的弹簧启动应用程序。这是控制器,下面是响应。我正在使用邮递员工具向此控制器发送请求。并发送内容类型为application / json

    @RequestMapping(value = "/test", method = RequestMethod.POST)
public String test(@RequestBody WebApp webapp, @RequestBody String propertyFiles, @RequestBody String) {
    System.out.println("webapp :"+webapp);
    System.out.println("propertyFiles :"+propertyFiles);
    System.out.println("propertyText :"+propertyText);

    return "ok good";
}
Run Code Online (Sandbox Code Playgroud)

2018-03-21 12:18:47.732警告8520-[nio-8099-exec-3] .wsmsDefaultHandlerExceptionResolver:由处理程序执行引起的已解决异常:org.springframework.http.converter.HttpMessageNotReadableException:读取时发生I / O错误输入消息;嵌套异常为java.io.IOException:流关闭

这是我的邮递员要求

{
"webapp":{"webappName":"cavion17","path":"ud1","isQA":true},
"propertyFiles":"vchannel",
"propertytText":"demo property"}
Run Code Online (Sandbox Code Playgroud)

我尝试通过删除RequestBody批注来进行尝试,然后能够命中该服务,但是param对象将被接收为null。

因此,请提出如何在restcontroller中检索对象的建议?

Yuv*_*wal 5

您不能@RequestBody在Spring中使用多个注释。您需要将所有这些包装在一个对象中。

像这样

// some imports here
public class IncomingRequestBody {
    private Webapp webapp;
    private String propertryFiles;
    private String propertyText;

    // add getters and setters here
}
Run Code Online (Sandbox Code Playgroud)

而在您的控制器中

@RequestMapping(value = "/test", method = RequestMethod.POST)
public String test(@RequestBody IncomingRequestBody requestBody) {
    System.out.println(requestBody.getPropertyFiles());
    // other statement
    return "ok good";
}
Run Code Online (Sandbox Code Playgroud)

在此处阅读更多内容 使用Ajax将@RequestBody中的多个变量传递给Spring MVC控制器