我有这个对象,它有一个 ZonedDateTime 字段:
导入 java.time.ZonedDateTime;
public class TestObject {
private ZonedDateTime testTime;
public ZonedDateTime getTestTime() {
return testTime;
}
public void setTestTime(ZonedDateTime testTime) {
this.testTime = testTime;
}
}
以及两个不同的控制器,其中端点使用相同的对象:
@Controller
@RequestMapping("/web")
@Import(ControllerWebConfiguration.class)
public class ControllerWeb {
@PostMapping("/example")
public ResponseEntity<String> example(@RequestBody TestObject testObject) {
return ResponseEntity.ok(testObject.toString());
}
}
@Controller
@RequestMapping("/mobile")
@Import(ControllerMobileConfiguration.class)
public class ControllerMobile {
@PostMapping("/example")
public ResponseEntity<String> example(@RequestBody TestObject testObject) {
return ResponseEntity.ok(testObject.toString());
}
}
他们的 ZonedDateTime 使用略有不同的“反序列化”:
public class ZonedDateTimeDeserializerWeb extends JsonDeserializer<ZonedDateTime> {
@Override
public ZonedDateTime deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
ObjectCodec oc = jsonParser.getCodec();
JsonNode node = oc.readTree(jsonParser);
String dateTimeString = node.asText();
return ZonedDateTime.parse(dateTimeString, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssX"));
}
}
public class ZonedDateTimeDeserializerMobile extends JsonDeserializer<ZonedDateTime> {
@Override
public ZonedDateTime deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
ObjectCodec oc = jsonParser.getCodec();
JsonNode node = oc.readTree(jsonParser);
String dateTimeString = node.asText();
return ZonedDateTime.parse(dateTimeString, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX"));
}
}
@Configuration
public class ControllerWebConfiguration {
@Bean
public ObjectMapper objectMapperWeb() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule moduleWeb = new SimpleModule();
moduleWeb.addDeserializer(ZonedDateTime.class, new ZonedDateTimeDeserializerWeb());
objectMapper.registerModule(moduleWeb);
return objectMapper;
}
}
@Configuration
public class ControllerMobileConfiguration {
@Bean
public ObjectMapper objectMapperMobile() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule moduleMobile = new SimpleModule();
moduleMobile.addDeserializer(ZonedDateTime.class, new ZonedDateTimeDeserializerMobile());
objectMapper.registerModule(moduleMobile);
return objectMapper;
}
}
我已经尝试了上面的解决方案,但是Springboot不允许两个objectMapper bean;有什么办法可以实现我想要的吗?
提前致谢!
正如这个答案中所解释的,Spring 在底层使用单个
MessageConverter
,而后者又使用主 ObjectMapper
。因此,您不能只使用 @Primary
和 @Qualifier
注释来拥有同一类的多个反序列化器 bean,如 这个 Baeldung 教程 中所示,因为它不起作用。
您可以使用链接答案中提供的解决方案,但我认为在您的情况下不值得这么麻烦。我只需将
TestObject
替换为定义 getter/setter 的接口,并在 WebTestObject
和 MobileTestObject
中实现该接口,每个接口都有一个注释有 Jackson 提示的字段,例如使用 @JsonSerialize
或 Hibernate @DateTimeFormat。