>  기사  >  Java  >  SpringBoot에서 날짜를 처리하는 방법은 무엇입니까?

SpringBoot에서 날짜를 처리하는 방법은 무엇입니까?

PHPz
PHPz앞으로
2023-05-16 14:58:061414검색

Spring Boot에서는 일반적으로 Jackson을 사용하여 Java 객체를 JSON으로 직렬화 및 역직렬화합니다. 날짜 직렬화를 수행할 때 날짜 형식을 지정해야 합니다. 그렇지 않으면 Jackson이 기본 형식을 사용하게 되는데 이는 우리가 원하는 것이 아닐 수도 있습니다. 날짜 형식을 지정하는 방법에는 두 가지가 있습니다.

처리가 없으면 기본 결과는 아래와 같습니다. 따라서 날짜를 처리하려면 몇 가지 방법을 사용해야 합니다.

SpringBoot에서 날짜를 처리하는 방법은 무엇입니까?

방법 1: 주석 사용(권장하지 않음)

엔티티 클래스 날짜 속성에 @JsonFormat()을 추가하고 매개변수 패턴을 사용하여 원하는 형식 예제의 형식을 다음과 같이 지정할 수 있습니다.

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;

이번에는 프런트 엔드는 우리 설정을 따릅니다. 형식 표시

SpringBoot에서 날짜를 처리하는 방법은 무엇입니까?

위 방법의 경우 프런트 엔드에 표시되는 모든 날짜에 @JSONFormat 주석을 추가해야 하므로 매우 번거로워 방법 2가 있습니다. 글로벌을 통해

방법 2 사용자 정의 메시지 변환기

먼저 Jackson 패키지의 ObjectMapper를 소개합니다.

ObjectMapper는 Jackson 라이브러리의 클래스입니다.

  • Java 객체를 JSON/XML 및 기타로 직렬화합니다.

  • JSON/XML 및 기타 형식의 데이터를 Java 객체로 역직렬화합니다.

그래서 객체를 JSON/XML로 변환하는 것이 핵심입니다.

그런 다음 이 클래스에서 뭔가를 할 수 있습니다.

(1) 생성자에서 날짜 변환 형식을 사용자 정의합니다. ----속성의 초기화 값을 변경하는 것과 같습니다.

(2) 구성을 통해, SpringMVC는 호출 시 더 이상 Jackson의 사용자 정의 ObjectMapper를 호출하지 않고 우리의 사용자 정의 형식을 사용합니다

이제 이 두 단계를 통해 구현하겠습니다.

1단계:ObjectMapper를 상속하고 생성자 메서드인 사용자 정의 직렬화 메서드를 다시 작성합니다.

public class JacksonObjectMapper extends ObjectMapper {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    //public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

2단계: Spring에서 사용자 정의 메시지 변환기를 사용하도록 하세요.

여기서 어떻게 처리해야 할까요? 구성 파일을 어디에서 구성해야 할까요?

우선 인터셉터를 생각해 볼 수 있을까요? 인터셉터에는 차단 규칙을 구성하는 구성 클래스가 있습니까? 그렇다면 여기서 구성할 수 있습니까?

binggo, 바로 여기에서 인터셉터를 구성하고 있습니다. 클래스를 구성하면 WebMvcConfigurationSupport 클래스가 있습니다.

가로채기 규칙을 구성하기 위해 일반적으로 사용되는 protected void addInterceptors(InterceptorRegistry Registry) { ... }가 있습니다protected void addInterceptors(InterceptorRegistry registry) { ... } 配置拦截规则

public void addResourceHandlers(ResourceHandlerRegistry registry) {... } 配置资源处理

等等有很多配置方法.而我们的消息转换器也在其中

protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {...}

通过在这个方法中配置相关信息,即可改变Spring默认指定的规则,而使用我们自己定义的规则(组件)

代码如下:

@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    log.info("扩展消息转换器...");
    //创建一个消息转换器对象,注意不要导错包是Jackson2Http
    MappingJackson2HttpMessageConverter converter =  new MappingJackson2HttpMessageConverter();
    //需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据
    converter.setObjectMapper(new JacksonObjectMapper());
    //将自己的消息转化器加入容器中
    converters.add(0, converter);
}
  • 创建了一个MappingJackson2HttpMessageConverter,这是Spring MVC集成Jackson的消息转换器,可以将Java对象序列化/反序列化为JSON。

  • 为消息转换器指定使用我们的JacksonObjectMapper, 用来将Java对象序列化/反序列化为JSON。

  • 将刚才创建的MappingJackson2HttpMessageConverter对象加入到消息转换器列表converters中,并且加入到第一个位置,让其优先使用

由于我们重写了extendMessageConverters()方法,Spring MVC会调用这个方法并使用我们添加的消息转换器。所以,我们添加的MappingJackson2HttpMessageConverter会生效,并使用我们自定义的JacksonObjectMapper(),用来处理对象与JSON之间的序列化和反序列化。

因为我们的消息转换器是第一个消息转换器,如果客户端要求返回JSON数据Spring MVC会选择我们的这个消息转换器进行对象序列化。

从而实现了对系统所有的日期按照我们要求的格式进行序列化.

此时前端数据也就是我们设置的格式.不在是Jackson默认的格式.

既然提到了日期,与之类似的还有一个对敏感信息的处理:

我们在返回前端数据的时候可能会因为实体类的设计,或者不想让前端能够看到该数据,此时就需要通过一些手段对数据进行一些处理, 还是两种方式.

  • 在返回之前对数据的值进行替换, 调用set方法设置为 垃圾信息, 比如 setPassword(“******”)

  • 是在实体类中使用Jackson提供的 @JsonIgnore

    public void addResourceHandlers(ResourceHandlerRegistry Registry) {... } 리소스 처리를 구성하는 방법에는
등이 많이 있습니다. 그리고 우리의 메시지 변환기도 그 중 하나입니다. 🎜rrreee🎜 이 방법을 통해 관련 정보를 구성하면 지정된 규칙을 변경할 수 있습니다. 🎜🎜코드는 다음과 같습니다. 🎜rrreee🎜🎜🎜Java 객체를 직렬화/역직렬화할 수 있는 Spring MVC용 메시지 변환기인 MappingJackson2HttpMessageConverter를 생성했습니다. JSON으로. 🎜🎜🎜🎜Java 개체를 JSON으로 직렬화/역직렬화하는 데 사용되는 메시지 변환기에 JacksonObjectMapper 사용을 지정합니다. 🎜🎜🎜🎜방금 생성한 MappingJackson2HttpMessageConverter 객체를 메시지 변환기 목록 변환기에 추가하고 첫 번째 위치에 추가하여 먼저 사용할 수 있도록 하세요.🎜🎜🎜🎜extendMessageConverters() 메서드를 다시 작성했으므로 Spring MVC는 다음을 호출합니다. 이 방법을 사용하고 우리가 추가한 메시지 변환기를 사용하세요. 따라서 우리가 추가한 MappingJackson2HttpMessageConverter가 적용되고 사용자 정의 JacksonObjectMapper()를 사용하여 객체와 JSON 간의 직렬화 및 역직렬화를 처리합니다. 🎜🎜우리의 메시지 변환기는 첫 번째 메시지 변환기이기 때문에 클라이언트가 JSON 데이터 반환을 요청하면 Spring MVC는 객체 직렬화를 위해 메시지 변환기를 선택합니다. 🎜🎜따라서 시스템의 모든 날짜는 우리가 요구하는 형식에 따라 직렬화됩니다. 🎜🎜이때 프론트엔드 데이터는 우리가 설정한 형식이 아닙니다. 🎜🎜날짜 이후. 민감한 정보 처리도 있습니다: 🎜🎜프런트 엔드 데이터를 반환할 때 엔터티 클래스의 설계로 인해 데이터를 처리하기 위한 몇 가지 수단을 사용해야 할 수도 있습니다. 프런트 엔드에서 데이터를 볼 수 없도록 하거나 두 가지 방법으로.🎜🎜🎜🎜반환하기 전에 데이터의 값을 바꾸고, set 메소드를 호출하여 스팸 정보로 설정합니다. setPassword("******")🎜🎜🎜🎜는 엔터티 클래스에서 Jackson이 제공하는 @JsonIgnore 주석을 사용하여 해결할 수도 있습니다. 필드. 🎜🎜🎜

위 내용은 SpringBoot에서 날짜를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제