我知道有很多关于这个问题问题,但是我找不到一个适合我的解决方案,所以我重新开始。
我在一个由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配置的问题
非常感谢阅读
1条答案
按热度按时间ktecyv1j1#
我终于找到了解决问题的方法。
我有这样的课:
我发现删除@EnableWebFlux注解可以解决我的问题。实际上,该注解覆盖了默认配置,因此,该参数:
spring.Jackson.序列化.将日期作为时间戳写入=假
已被WebFluxConfigurer的默认值覆盖。
谢谢你试图帮助guyz,我希望它会对某人有用。