我正在尝试解析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
尝试使用Object Mapper将vehicle对象转换为json字符串,在这种情况下,您将不需要在方法参数中请求。并且您正在使用post request方法,然后如果条件不需要。
你能试试下面的代码吗:
主要问题的解决方案是,由于您正在使用@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英文