jackson 防止spring reactive将日期作为时间戳返回

m3eecexj  于 2022-11-08  发布在  Spring
关注(0)|答案(1)|浏览(149)

我知道有很多关于这个问题问题,但是我找不到一个适合我的解决方案,所以我重新开始。
我在一个由Spring Reactive提供支持的应用程序上工作。当我在一个端点上请求时,日期作为时间戳返回。我尝试了很多解决方案来将日期格式设置为“YYYY-MM-DD HH:MM:SS”,但没有任何效果。

我尝试的解决方案:

  • 添加***com.fasterxml.Jackson.数据类型:jackson-数据类型-joda***到我的gradle.build文件中
  • 将***spring.Jackson.序列化.write-dates-as-timestamps=false***添加到application.properties

但它不起作用
使用像@JsonFormat(“yyyy...”)这样的注解效果很好,但我更喜欢全局配置,因为我们是一个团队在项目上工作,我想防止人为错误。将日期类型更改为LocalDateTime也很好,但需要对应用程序进行大量的返工,如果我们能防止团队这样做,那就太好了。
有人知道为什么全局配置在我的应用程序上不起作用,以及如何使它起作用吗?
你可以在下面找到一个代码的例子。出于保密的原因,我删除了变量名。在代码执行过程中,日期的格式很好,当解析为JSON时,会变成时间戳。

路由器

@Override
protected RouterFunction<ServerResponse> router() {
    return RouterFunctions.route()
            .path(apiPrefix , builder -> builder
                    .GET(« /list » , myHandler::listSomeObject)
            )
            .build();
}

处理程序

@NonNull
public Mono<ServerResponse> listSomeObject(ServerRequest request) {
    return myService.listObject()
            .flatMap(response -> status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).bodyValue(response));
}

服务

Mono<List<Object>> listObject();

对象

@AllArgsConstructor
public class Object {

    public final Long id;
    public final Optional<Date> date;
}

顺便说一下,在JacksonAutoConfiguration文件中,我可以看到:

static {
    Map<Object, Boolean> featureDefaults = new HashMap<>();
    featureDefaults.put(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    featureDefaults.put(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false);
    FEATURE_DEFAULTS = Collections.unmodifiableMap(featureDefaults);
}

所以问题可能不是Jackson配置的问题
非常感谢阅读

ktecyv1j

ktecyv1j1#

我终于找到了解决问题的方法。
我有这样的课:

@Configuration
@EnableWebFlux
public class WebFluxConfig implements WebFluxConfigurer {...}

我发现删除@EnableWebFlux注解可以解决我的问题。实际上,该注解覆盖了默认配置,因此,该参数:
spring.Jackson.序列化.将日期作为时间戳写入=假
已被WebFluxConfigurer的默认值覆盖。
谢谢你试图帮助guyz,我希望它会对某人有用。

相关问题