Spring MVC 自定义addCorsMappings()时,Json中的转换java-object(dto)期间出现中断转换日期

xyhw6mcr  于 2022-11-14  发布在  Spring
关注(0)|答案(2)|浏览(103)

我们需要自定义全局配置,该配置描述了请求的设置cors-header。
我使用SpringBoot,一个项目是以文件扩展名 *. war打包的SpringBoot。

@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年3月14日11时32分33秒”,

但是一个客户

[2020年3月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

我执行了以下操作;

  • application.properties

第一个

  • 数据输出
...
  private LocalDateTime statusDate;
...

我得到:

为什么会这样呢?
它如何正确?
谁有什么想法?

更新_5

我拒绝使用@EnableWebMvc注解。
我的配置类现在是:

@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);
            }
        };
    }
}

问题解决了。

2q5ifsrm

2q5ifsrm1#

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

fykwrbwg

fykwrbwg2#

如果添加@EnableWebMvc,则默认情况下启用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。因此,请手动配置Jackson对象Map器以禁用此功能。

@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

您也可以使用此行添加自己的串行器类(例如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));
  }
}

相关问题