SpringMVC가 Java8 시간 JSON 데이터로 되돌아오는 포맷 문제 해결

5645 단어 springmvcjson
때때로 Spring MVC에서 JSON 형식의 response를 되돌릴 때 @ResponseBody 주석을 사용하지만, java8의 시간을 처리할 때 매우 번거롭습니다. 일반적으로 우리가 사용하는 HTTP Message Converter는 Mapping Jackson2Http Message Converter입니다. 기본적으로 되돌아오는 시간 형식은 다음과 같습니다.

"startDate" : {
  "year" : 2010,
  "month" : "JANUARY",
  "dayOfMonth" : 1,
  "dayOfWeek" : "FRIDAY",
  "dayOfYear" : 1,
  "monthValue" : 1,
  "hour" : 2,
  "minute" : 2,
  "second" : 0,
  "nano" : 0,
  "chronology" : {
   "id" : "ISO",
   "calendarType" : "iso8601"
  }
 }
그러나 우리는 이런 것을 전단에 되돌려 주지 않는다. LocalDate가 되돌려 주고 싶은 형식은 2016-11-26이고, LocalDateTime이 되돌려 주고 싶은 형식은 2016-11-26 21:04:34이다.프로젝트 연구를 통해 관련 자료를 찾아보고 개인 연구에서 실현된 두 가지 방식을 소개한다.
해결 방법 1:
maven 프로젝트라면pom에 아래jar 패키지를 도입합니다.

<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
   <version>2.8.5</version>
 </dependency>
그리고 JSON화된 POJO 필드의 get 함수에 @Json Serializer 주석을 추가합니다. 다음과 같습니다.

import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public LocalDateTime getBirthday() {
    return this.loginTime;
  }

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
public LocalDateTime getLastLoginTime() {
    return this.loginTime;
  }

이런 방식의 장점은 구체적인 영역 유형에 대해 서로 다른 디스플레이 방식을 설정할 수 있다는 것이다. 그러나 장점도 단점이다. 모든 날짜 속성은 수동으로 추가해야 하기 때문에 실제 날짜 속성은 보편적으로 필요하고 jsr310의jar 패키지를 추가로 도입해야 한다.
해결 방법 2:
ObjectMapper를 상속하여 json 문자열을 반환합니다.MappingJackson2HttpMessageConverter는 주로 ObjectMapper를 통해 json 문자열을 되돌려줍니다.여기에서 우리는 JsonUtil 클래스를 작성하여 ObjectMapper를 가져와java8의 새로운 날짜 시간 API에 대해 해당하는 JsonSerializer를 등록합니다.

/**
 * json 
 * 
 * 
 */
@Component
public class JsonUtil {

  private static final ObjectMapper mapper;

  public ObjectMapper getMapper() {
    return mapper;
  }

  static {

    mapper = new ObjectMapper();

    SimpleModule module = new SimpleModule();
    module.addSerializer(LocalDate.class, new LocalDateSerializer());
    module.addSerializer(LocalTime.class, new LocalTimeSerializer());
    module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
    mapper.registerModule(module);
  }

  public static String toJson(Object obj) {
    try {
      return mapper.writeValueAsString(obj);
    } catch (Exception e) {
      throw new RuntimeException(" json !");
    }
  }

  public <T> T toObject(String json, Class<T> clazz) {
    try {
      return mapper.readValue(json, clazz);
    } catch (IOException e) {
      throw new RuntimeException(" json !");
    }
  }
}

class LocalDateSerializer extends JsonSerializer<LocalDate> {

  private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

  @Override
  public void serialize(LocalDate value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(dateFormatter.format(value));
  }
}

class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {

  private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

  @Override
  public void serialize(LocalDateTime value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(dateTimeFormatter.format(value));
  }

}

class LocalTimeSerializer extends JsonSerializer<LocalTime> {

  private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");

  @Override
  public void serialize(LocalTime value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(timeFormatter.format(value));

  }

}

그리고springmvc의 설정 파일에서 를 다음 설정으로 바꾸고 새로운 json 변환기를 설정합니다. 이 변환기는spring에 내장된 json 변환기보다 우선순위가 높기 때문에 json과 관련된 변환은spring에서 우선적으로 사용합니다.

<mvc:annotation-driven>
    <mvc:message-converters>
      <bean
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="objectMapper" value="#{jsonUtil.mapper}" />
        <property name="supportedMediaTypes">
          <list>
            <value>application/json;charset=UTF-8</value>
          </list>
        </property>
      </bean>
    </mvc:message-converters>
  </mvc:annotation-driven>
그리고java8의 몇 가지 날짜와 시간 유형은 정상적으로 우호적으로 나타날 수 있습니다.장점은 전역적으로 날짜와 시간 등 유형을 통일하고 포조 중의 특정한 영역을 특수하게 처리하는 단점이다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기