Java 在SpringBootRESTfulWebService中获取映射和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

我正在尝试使用SpringBoot解析用于post请求的json主体请求。我想将body映射到vehicle类上的字段,并将普通的json body存储到某个变量,以备将来使用。但在尝试访问普通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);
}
例外情况

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