根据用作参数的控制器来反序列化和序列化控制器之间共享对象中的 ZonedDateTime 字段?

问题描述 投票:0回答:1

我有这个对象,它有一个 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;有什么办法可以实现我想要的吗?

提前致谢!

java spring-boot java-11 json-deserialization zoneddatetime
1个回答
0
投票

正如这个答案中所解释的,Spring 在底层使用单个

MessageConverter
,而后者又使用主
ObjectMapper
。因此,您不能只使用
@Primary
@Qualifier
注释来拥有同一类的多个反序列化器 bean,如 这个 Baeldung 教程 中所示,因为它不起作用。

您可以使用链接答案中提供的解决方案,但我认为在您的情况下不值得这么麻烦。我只需将

TestObject
替换为定义 getter/setter 的接口,并在
WebTestObject
MobileTestObject
中实现该接口,每个接口都有一个注释有 Jackson 提示的字段,例如使用
@JsonSerialize 
Hibernate @DateTimeFormat

© www.soinside.com 2019 - 2024. All rights reserved.