我知道关于这个问题存在很多问题,但我找不到一个适合我的解决方案,所以我重新打开了这个问题。
我正在开发一个由Spring Reactive驱动的应用程序。当我在端点上请求时,日期作为时间戳返回。我尝试了很多解决方案来将日期格式化为"YYYY-MM-DD HH:MM:SS",但都不起作用。
Solution i tried:
- 添加com.fasterxml.jackson.datatype: jackson-datatype-joda到我的gradle。构建文件
- 添加spring.jackson.serialization.write-dates-as-timestamps = false到application.properties
但是它不工作
使用像@JsonFormat("yyyy…")这样的注释可以很好地工作,但我更喜欢全局配置,因为我们是一个团队在这个项目上工作,我想防止人为错误。将Date类型更改为LocalDateTime也可以很好地工作,但需要对应用程序进行大量的返工,如果我们可以防止团队这样做,那就很好了。
有人知道为什么全局配置不能在我的应用程序上工作,以及如何使它工作吗?
您可以在下面找到一个示例代码。出于保密原因,我删除了变量名。日期在代码执行时格式化良好,解析为JSON时转换为时间戳。
路由器
@Override
protected RouterFunction<ServerResponse> router() {
return RouterFunctions.route()
.path(apiPrefix , builder -> builder
.GET(« /list » , myHandler::listSomeObject)
)
.build();
}
<<p>处理程序/strong>@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配置
感谢您的阅读
我终于找到解决问题的办法了。
我有这个类:
@Configuration
@EnableWebFlux
public class WebFluxConfig implements WebFluxConfigurer {...}
我发现删除@EnableWebFlux注释修复我的问题。实际上,那个注释覆盖了默认配置所以,那个参数:
spring.jackson.serialization.write-dates-as-timestamps = false
被webfluxconfigiler的默认值覆盖了。
谢谢你的帮助,我希望它会对别人有用。