在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字符串,在这种情况下,您不需要方法参数中的请求。 并且您正在使用请求后方法,那么如果不需要条件。