Java 在SpringBootRESTfulWebService中获取映射和Json文本
我正在尝试使用SpringBoot解析用于post请求的json主体请求。我想将body映射到vehicle类上的字段,并将普通的json body存储到某个变量,以备将来使用。但在尝试访问普通json正文时,我总是遇到流关闭异常。有人能帮我解决这个问题吗。提前谢谢 代码Java 在SpringBootRESTfulWebService中获取映射和Json文本,java,spring,spring-boot,spring-restcontroller,spring-rest,Java,Spring,Spring Boot,Spring Restcontroller,Spring Rest,我正在尝试使用SpringBoot解析用于post请求的json主体请求。我想将body映射到vehicle类上的字段,并将普通的json body存储到某个变量,以备将来使用。但在尝试访问普通json正文时,我总是遇到流关闭异常。有人能帮我解决这个问题吗。提前谢谢 代码 @RequestMapping(value = "/GetDriverDetails", method = RequestMethod.POST) public ResponseEntity<Vehi
@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);
}
例外情况
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]尝试使用对象映射器将车辆对象转换为json字符串,在这种情况下,您不需要方法参数中的请求。
如果不需要条件,则使用post请求方法。您可以尝试以下代码: 主要问题的解决方案是,由于您使用的是@RequestBody,内容已经被读取并映射到pojo类,因此流被UTIzed并关闭。在这种情况下,您根本不想使用
@RequestBody
。请在下面找到我的实现:
@PostMapping(path=“update vehicle details”,consumes=MediaType.ALL\u值)
公共车辆河流更新HicleDetails(HttpServletRequest请求)引发IOException{
ContentCachingRequestWrapper request1=新ContentCachingRequestWrapper(请求);
String collect=request1.getReader().lines().collect(collector.joining(System.lineSeparator());
系统输出打印项次(收集);
final VehicleDriver VehicleDriver=新的ObjectMapper().readValue(collect,VehicleDriver.class);
返回河流;
}
否则,使用一种简单的方法,从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;
}
@RestController
公共静态类TestController{
@PostMapping(path=“update vehicle details”,consumes=MediaType.APPLICATION\u JSON\u VALUE)
公共字符串UpdateHicleDetails(@RequestBody VehicleDriver VehicleDriver)引发JsonProcessingException{
最终StringBuilder StringBuilder=新StringBuilder(vehicleDriver.vehicleName);
列表驱动器详细信息=可选。不可用(
车辆(司机)
.map(集合::流)
.orElse(Stream.empty())
.map(d->“name=:”+d.name+”,许可证号:“+d.licenseNumber”)
.collect(Collectors.toList());
stringBuilder.append(“\n”);
stringBuilder.append(driverDetails);
String stringRepresentationOfBody=new ObjectMapper().writeValueAsString(vehicleDriver);
//返回stringBuilder.toString();
返回字符串表示身体;
}
}
公共静态级车辆{
公共字符串车辆名称;
公共字符串车辆模型;
公开司机名单;
}
公共静态类驱动程序{
公共字符串名称;
公共字符串许可证号码;
}
强制调用方使用application/json类型如果您现在就解决了这个问题,将来您可能会花费不必要的时间来完成和修复bug,现在是强制执行限制的正确时机!非常感谢你的努力
@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;
}