[英]There is disrupt convert date during transformation java-object (dto) in Json When I customize addCorsMappings()
我們需要自定義描述請求設置 cors-header 的全局配置。
我使用 SpringBoot,一個項目是 spring bootpackaged 文件擴展名 *.war。
@SpringBootConfiguration
@EnableScheduling
@SpringBootApplication
public class App
extends SpringBootServletInitializer
implements WebApplicationInitializer {
private static final Logger LOGGER = LoggerFactory.getLogger( App.class );
public static void main(String[] args) {
LOGGER.info("Start an application...");
SpringApplication.run(App.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
LOGGER.info("There is building the web application!");
return builder.sources(App.class);
}
}
這是 cors-header 的設置。 我必須導入 Spring MVC 配置( @EnableWebMvc ),我設置的配置才能工作。
@EnableWebMvc
@Configuration
public class CorsGlobalConfiguration {
private final static String ROOT_API = "/**";
@Bean
public WebMvcConfigurer corsConfig(){
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping(ROOT_API)
.allowedHeaders("*")
.allowedOrigins("*")
.allowedMethods("GET","POST","PUT");
}
};
}
}
但是一個客戶已經得到了一個 json 的數組。
例如:
客戶必須獲得:
"2020-03-14T11:32:33",
但是一個客戶正在
[2020, 03, 14, 11, 32, 33]
更新_1
我做到了。
@Configuration
public class JacksonConfig {
@Bean
@Primary
public ObjectMapper configureObjectMapper() {
JavaTimeModule javaTimeModule = new JavaTimeModule();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(javaTimeModule);
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return objectMapper;
}
}
它不起作用。
更新_2
我做到了。
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false
它不起作用。
更新_3
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.10.3</version>
</dependency>
和
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false
它也不起作用。
更新_4
我執行了以下操作;
#spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
@Component
public class JacksonLocalDateSerializer extends StdSerializer<LocalDateTime> {
private static final long serialVersionUID = -7880057299936771237L;
private static final DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSZ")
.withResolverStyle(ResolverStyle.STRICT);
public JacksonLocalDateSerializer(Class<LocalDateTime> t) {
super(t);
}
public JacksonLocalDateSerializer() {
this(null);
}
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeString(formatter.format(value));
}
}
@Configuration
public class JacksonConfig {
private JacksonLocalDateSerializer jacksonLocalDateSerializer;
@Autowired
public JacksonConfig(JacksonLocalDateSerializer jacksonLocalDateSerializer) {
this.jacksonLocalDateSerializer = jacksonLocalDateSerializer;
}
@Bean
@Primary
public ObjectMapper configureObjectMapper() {
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, this.jacksonLocalDateSerializer);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(javaTimeModule);
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return objectMapper;
}
}
...
private LocalDateTime statusDate;
...
我得到:
為什么會這樣?
如何正確?
誰有什么想法?
更新_5
我拒絕使用 @EnableWebMvc 注釋。
我的配置 class 現在是:
@Configuration
public class CorsGlobalConfiguration {
@Value("${api.prefix}")
private String apiPrefix;
@Value("${header.cors.origins.allow}")
private String [] headerCorsOriginsAllow;
@Value("${header.cors.methods.allow}")
private String [] headerCorsMethodsAllow;
@Bean
public WebMvcConfigurer corsConfig() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping(apiPrefix)
.allowedOrigins(headerCorsOriginsAllow)
.allowedMethods(headerCorsMethodsAllow);
}
};
}
}
問題已經解決了。
將jackson-datatype-jsr310
添加到您的依賴項中。
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId></artifactId>
<version>2.9.7</version>
</dependency>
然后將以下屬性添加到您的application.properties
文件中:
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false
如果添加@EnableWebMvc
,則默認啟用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
因此,手動配置 Jackson Object 映射器以禁用此功能。
@Configuration
public class JacksonConfig {
@Bean
@Primary
public ObjectMapper configureObjectMapper() {
JavaTimeModule javaTimeModule = new JavaTimeModule();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(javaTimeModule);
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return objectMapper;
}
}
或者
在application.properties
中更改它
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false
您還可以使用此行添加您自己的序列化器 class (例如JacksonLocalDateSerializer
)
javaTimeModule.addSerializer(LocalDate.class, new JacksonLocalDateSerializer());
示例:這里我需要顯示為格式yyyy-MM-dd HH:mm:ss
public class JacksonLocalDateSerializer extends StdSerializer<LocalDate> {
private static final long serialVersionUID = -7880057299936771237L;
private static final DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
.withResolverStyle(ResolverStyle.STRICT);
public JacksonLocalDateSerializer() {
this(null);
}
public JacksonLocalDateSerializer(Class<LocalDate> type) {
super(type);
}
@Override
public void serialize(LocalDate value, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeString(formatter.format(value));
}
}
我已經寫了有關如何解決此問題的詳細說明,請在此處找到:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.