gpt4 book ai didi

java - 当我尝试反序列化抽象类时,Jackson Objectmapper 在配置为 bean 后未由 Spring 初始化

转载 作者:行者123 更新时间:2023-12-01 17:43:51 25 4
gpt4 key购买 nike

我在 Spring Boot 应用程序中使用 Jackson xml 版本 2.9.9。

我有一个接受 Vehicle 的 Controller ,它是一个具有 2 个子类的抽象类。当我从 postman 传递 JSON 数据时,我无法反序列化车辆,因为自动连接的对象映射器始终为空(我将对象映射器配置为 bean,因为我将反序列化器设置为映射器的简单模块)。请查看 https://github.com/vin0010/Jackson-Mapper-Issue 中的示例代码

Controller

@RequestMapping(path = "/jackson", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void forSingleObject(@RequestBody MyModel myModel){
System.out.println("Deserialization successful");
}

MyModel.java

public class MyModel {
private String name;
private Vehicle value;
}

Vehicle.java

public abstract class Vehicle {
private String vehicleName;
}

Car.java

public class Car extends Vehicle{
private String carType;
private String carDriverName;
}

Auto.java

public class Auto extends Vehicle {
private String autoType;
private String autoDriverName;
}

ObjectMapper bean configuration

@Configuration
public class MapperConfig {
@Bean
public ObjectMapper objectMapper(){
ObjectMapper objectMapper = new ObjectMapper();//Jackson2ObjectMapperBuilder.json().build();
List<Module> modules = new ArrayList<>();
modules.add(new SimpleModule().addDeserializer(Vehicle.class, new VehicleDeserializer()));
objectMapper.registerModules(modules);
return objectMapper;
}
}

VehicleDeserializer.java

public class VehicleDeserializer extends JsonDeserializer<Vehicle> {

@Autowired
private ObjectMapper objectMapper;
@Override
public Vehicle deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser);
Vehicle vehicle=null;
if (!jsonNode.findPath("carDriverName").equals("")){
vehicle = objectMapper.readValue(jsonParser, Car.class);
}else if (!jsonNode.findPath("autoDriverName").equals("")){
vehicle = objectMapper.readValue(jsonParser, Auto.class);
}
return vehicle;
}
}

JSON input

{
"name": "Bajaj",
"value": {
"autoDriverName": "Mr Auto Driver",
"autoType": "commercial"
}
}

Problem : Object mapper is not injected and its null.

我刚刚发现对象映射器都没有在 VehicleDeserializer.java 中初始化,也没有找到一种在没有 ObjectMapper 帮助的情况下将字符串反序列化为 Car/Auto 的方法。

我尝试了 How do I obtain the Jackson ObjectMapper in use by Spring 4.1? 中的所有方法但似乎没有任何作用。

我将其添加为一个单独的问题,因为我需要修复注入(inject) Objectmapper 或在不使用 Objectmapper 的情况下反序列化 Car/Auto(但我仍然只能使用 Fasterxml)。

在VehicleDeserializer.java中创建一个新的ObjectMapper没有帮助,因为即使我向其中添加反序列化器,它总是返回Car/Auto的空对象。我做了这个例子,因为它只是一个 https://stackoverflow.com/help/minimal-reproducible-example 。我需要jackson来完成反序列化

最佳答案

无需尝试在自定义反序列化器中注入(inject)ObjectMapper。您可以使用:

ObjectMapper mapper = (ObjectMapper) jsonParser.getCodec();

如果您不需要 ObjectMapper 中的任何方法,则不需要进行转换:

ObjectCodec codec = jsonParser.getCodec();

关于java - 当我尝试反序列化抽象类时,Jackson Objectmapper 在配置为 bean 后未由 Spring 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57789149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com