>Java >java지도 시간 >Java8 시간 JSON 데이터를 반환하는 SpringMVC의 형식 문제를 해결하는 방법에 대한 자세한 설명

Java8 시간 JSON 데이터를 반환하는 SpringMVC의 형식 문제를 해결하는 방법에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-07 10:03:082281검색

이번 글에서는 Java8 시간 JSON 데이터를 반환하는 SpringMVC의 포맷팅 문제를 해결하는 방법을 주로 소개합니다. 편집자는 꽤 괜찮다고 생각해서 지금 공유하고 참고용으로 올려드리겠습니다. 에디터를 따라가서 살펴보자

Spring MVC에서 JSON 형식으로 응답을 반환할 때 @ResponseBody 어노테이션을 사용하는 경우가 있는데, java8에서는 시간을 처리할 때 매우 번거로울 수 있다. 일반적으로 우리가 사용하는 HTTPMessageConverter는 다음과 같다. MappingJackson2HttpMessageConverter이며 기본적으로 반환되는 시간 형식은 다음과 같습니다.

"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 프로젝트인 경우 다음 jar 패키지를 pom에 도입합니다.

<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
   <version>2.8.5</version>
 </dependency>

그런 다음 JSON화하려는 POJO 필드의 get 함수에 다음과 같이 @JsonSerializer 주석을 추가합니다

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에 해당하는 JsonSerializer8742468051c85b06f0a0af9e3e506b5c

/**
 * 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 구성 파일에서 f7ba1f27e11c63617ca69c495697dd74를 다음 구성으로 변경하여 새로운 json 변환 변환기를 구성합니다. ObjectMapper 객체를 JsonUtil의 objectMapper 객체로 변환합니다. 이 변환기는 spring의 내장 json 변환기보다 우선순위가 높으므로 spring은 json 관련 변환에 이를 먼저 사용합니다.

<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의 여러 날짜 및 시간 유형이 정상적으로 표시될 수 있습니다. 날짜, 시간 등의 타입을 전역적으로 균일하게 관리한다는 장점이 있지만, POJO의 특정 필드를 특수하게 처리한다는 단점이 있다.

위 내용은 Java8 시간 JSON 데이터를 반환하는 SpringMVC의 서식 문제를 해결하는 방법에 대한 자세한 설명입니다. 자세한 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요. !


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.