如何解决在Spring Boot Restful webService中获取Mapping和Pain Json文本
我正在尝试使用Spring Boot解析传入请求的json正文请求。我想将主体映射到车辆类上的字段,也将普通的json主体存储到一些变量中以备将来使用。但是在尝试访问纯json主体时,我总是会遇到流关闭异常。有人可以帮我这个忙吗?在此先感谢
@RequestMapping(value = "/GetDriverDetails",method = RequestMethod.POST)
public ResponseEntity<Vehicle> GetVehicleDetails(@RequestBody Vehicle vehicle,HttpServletRequest request) {
System.out.println(vehicle);
String json;
if ("POST".equalsIgnoreCase(request.getmethod()))
{
try {
ContentCachingRequestWrapper request1 = new ContentCachingRequestWrapper(request);
String collect = request1.getReader().lines().collect(Collectors.joining(System.lineseparator()));
System.out.println(collect);
} catch (IOException e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
}
return new ResponseEntity<Vehicle>(HttpStatus.OK);
}
Json请求正文
{
"vehicleName": "brio","vehicleModel": "fisrtClass","drivers": [
{
"name": "rej","licenseNumber": "KLLicense1"
},{
"name": "Dan","licenseNumber": "KLLicense2"
},{
"name": "bala","licenseNumber": "KLLicense3"
},{
"name": "vijay","licenseNumber": "KLLicense4"
},{
"name": "aravind","licenseNumber": "KLLicense5"
},{
"name": "sathya","licenseNumber": "KLLicense6"
}
]
}
例外
java.io.IOException:流已关闭 在org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:359)〜[tomcat-embed-core-9.0.38.jar:9.0.38] 在org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:132)〜[tomcat-embed-core-9.0.38.jar:9.0.38] 在org.springframework.web.util.ContentCachingRequestWrapper $ ContentCachingInputStream.read(ContentCachingRequestWrapper.java:254)〜[spring-web-5.2.9.RELEASE.jar:5.2.9.RELEASE] 在java.base / sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)〜[na:na] 在java.base / sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)〜[na:na] 在java.base / sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)〜[na:na] 在java.base / java.io.InputStreamReader.read(InputStreamReader.java:181)〜[na:na]
解决方法
您可以尝试以下代码:
您的主要问题的解决方案,因为您使用的是@RequestBody,因此内容已被读取并映射到pojo类,因此在这种情况下完全不使用@RequestBody
会流化并关闭流。请在下面找到我的实现:
@PostMapping(path = "update-vehicle-details",consumes = MediaType.ALL_VALUE)
public VehicleDriver updateVehicleDetails(HttpServletRequest request) throws IOException {
ContentCachingRequestWrapper request1 = new ContentCachingRequestWrapper(request);
String collect = request1.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
System.out.println(collect);
final VehicleDriver vehicleDriver = new ObjectMapper().readValue(collect,VehicleDriver.class);
return vehicleDriver;
}
否则,使用一种简单的方法,从requestbody中解析的应用程序json内容类型中读取值,然后将该主体转换为字符串并返回相同的结果
@RestController
public static class TestController {
@PostMapping(path = "update-vehicle-details",consumes = MediaType.APPLICATION_JSON_VALUE)
public String updateVehicleDetails(@RequestBody VehicleDriver vehicleDriver) throws JsonProcessingException {
final StringBuilder stringBuilder = new StringBuilder(vehicleDriver.vehicleName);
List<String> driverDetails = Optional.ofNullable(
vehicleDriver.drivers)
.map(Collection::stream)
.orElse(Stream.empty())
.map(d -> "name=: " + d.name + ",license number:" + d.licenseNumber)
.collect(Collectors.toList());
stringBuilder.append("\n");
stringBuilder.append(driverDetails);
String stringRepresentationOfBody = new ObjectMapper().writeValueAsString(vehicleDriver);
// return stringBuilder.toString();
return stringRepresentationOfBody;
}
}
public static class VehicleDriver {
public String vehicleName;
public String vehicleModel;
public List<Driver> drivers;
}
public static class Driver {
public String name;
public String licenseNumber;
}
,
尝试使用对象映射器将车辆对象转换为json字符串,在这种情况下,您不需要方法参数中的请求。 并且您正在使用请求后方法,那么如果不需要条件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。