当前位置: 首页 > 知识库问答 >
问题:

在spring boot Restful webService中获取映射和Pain Json文本

卫念
2023-03-14

我正在尝试解析json体请求,使用spring boot来获取post请求。我想将主体映射到vehicle类上的字段,并将纯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

共有2个答案

上官恩
2023-03-14

尝试使用Object Mapper将vehicle对象转换为json字符串,在这种情况下,您将不需要在方法参数中请求。并且您正在使用post request方法,然后如果条件不需要。

朱阳曜
2023-03-14

你能试试下面的代码吗:

主要问题的解决方案是,由于您正在使用@RequestBody,因此内容已经被读取并映射到pojo类,因此stream被使用并关闭。在这种情况下,您根本不想使用@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;
    }
 类似资料:
  • 我在使用Spring通过java读取yaml时遇到了一个问题。让我先展示代码 我的yaml文件: spring上下文xml还具有以下功能: 在这里面,它说,所有的东西都是作为一个字符串而不是一个地图来阅读的。是否有其他类支持读取Yaml文件的方式:Spring boot-inject map from application.yml 还是我对YamlPropertiesFactoryBean的理解

  • 我是hadoop新手,目前正在hadoop上工作。我有一个小问题。 我在输入文件夹中有大约10个文件,我需要将其传递给我的地图缩减程序。我希望我的映射器中的文件名称,因为我的文件名称包含创建此文件的时间。我看到人们使用FileSplit在映射器中获取文件名称。如果假设我的输入文件包含数百万行,那么每次调用映射器代码时,它都会获取文件名称,然后从文件中提取时间,对于同一个文件来说,这显然是一件重复耗

  • 问题内容: 下面的Mappers代码从HDFS读取文本文件正确吗?如果是这样的话: 如果不同节点中的两个映射器尝试几乎同时打开文件,会发生什么情况? 是否不需要关闭?如果是这样,如何在不关闭文件系统的情况下执行此操作? 我的代码是: 问题答案: 这将起作用,并进行一些修改-我假设您粘贴的代码被截断了: 您可以有多个映射器读取同一个文件,但是使用分布式缓存存在更多的局限性(不仅减少了承载文件块的数据

  • 问题内容: 为了验证我收到的数据,我需要确保该长度不会超过数据库列的长度。现在,所有长度信息都存储在Hibernate映射文件中,是否可以通过编程方式访问此信息? 问题答案: 您可以实现,但这并不容易。您可能想要在启动时执行以下操作,并存储值的静态缓存。有很多特殊情况要处理(继承等),但它应适用于简单的单列映射。我可能遗漏了一些instanceof和null检查。

  • 我有多个数组映射。 我想从多个地图中获取重复地图键的列表。 例如 除了遍历所有地图键,检查集合是否包含键,如果不将键添加到集合中,我想不出任何更干净的方法。有没有办法通过streams来实现这一点?

  • 假设我调用了一个RESTful服务,它在响应体中返回这个 我只需要得到映射键为' en '的值 所以我期望过滤后的结果会像这样 [“Reason1 英文翻译”、“Reason2 英文翻译”] 或 {"Reason1英文翻译","Reason2英文翻译"} 我已经尝试了下一个代码,但仍未完成 然后它返回 [{en=Reason1英文翻译,es=Reason2西班牙文翻译},{en=Reason2英文