Heim > Java > javaLernprogramm > Ausführliche Erläuterung, wie das Formatierungsproblem gelöst werden kann, bei dem SpringMVC Java8-Zeit-JSON-Daten zurückgibt

Ausführliche Erläuterung, wie das Formatierungsproblem gelöst werden kann, bei dem SpringMVC Java8-Zeit-JSON-Daten zurückgibt

黄舟
Freigeben: 2017-03-07 10:03:08
Original
2257 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich beschrieben, wie das Formatierungsproblem gelöst werden kann, bei dem SpringMVC Java8-Zeit-JSON-Daten zurückgibt. Der Herausgeber hält es für recht gut, daher werde ich es jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Editor und werfen wir einen Blick darauf

Manchmal wird die Annotation @ResponseBody verwendet, wenn eine Antwort im JSON-Format in Spring MVC zurückgegeben wird, aber bei der Verarbeitungszeit in Java8 ist dies sehr problematisch. Im Allgemeinen verwenden wir den HTTPMessageConverter ist MappingJackson2HttpMessageConverter. Das standardmäßig zurückgegebene Zeitformat lautet:

"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"
  }
 }
Nach dem Login kopieren

Aber wir werden dies nicht an das Frontend zurückgeben, denken Sie darüber nach LocalDate Das zurückzugebende Format ist 26.11.2016, und das Format, das LocalDateTime zurückgeben möchte, sind Daten wie 26.11.2016 21:04:34. Durch Projektrecherche und Konsultation relevanter Informationen gibt es zwei Möglichkeiten, diese in die persönliche Forschung umzusetzen.

Lösung 1:

Wenn es sich um ein Maven-Projekt handelt, führen Sie das folgende JAR-Paket in den Pom ein:

<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
   <version>2.8.5</version>
 </dependency>
Nach dem Login kopieren

Fügen Sie dann wie folgt eine @JsonSerializer-Annotation zur Get-Funktion des POJO-Felds hinzu, das Sie JSONisieren möchten

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;
  }
Nach dem Login kopieren

Der Vorteil dieser Methode besteht darin, dass für bestimmte Domaintypen unterschiedliche Anzeigemethoden festgelegt werden können. Der Vorteil ist jedoch auch ein Nachteil, da jedes Datumsattribut in der Praxis manuell hinzugefügt werden muss Das Attribut ist im Allgemeinen erforderlich und es ist erforderlich, ein zusätzliches JAR-Paket von jsr310 einzuführen.

Lösung 2:

ObjectMapper erben, um eine JSON-Zeichenfolge zurückzugeben. MappingJackson2HttpMessageConverter verwendet hauptsächlich ObjectMapper, um JSON-Strings zurückzugeben. Hier schreiben wir eine JsonUtil-Klasse und rufen den ObjectMapper ab, um den entsprechenden JsonSerializer für die neue Datums- und Uhrzeit-API in Java8 zu registrieren.

/**
 * 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));

  }

}
Nach dem Login kopieren

Ändern Sie dann in der SpringMVC-Konfigurationsdatei in die folgende Konfiguration und konfigurieren Sie einen neuen JSON-Konverter setzt sein ObjectMapper-Objekt auf das objectMapper-Objekt in JsonUtil. Dieser Konverter hat eine höhere Priorität als der integrierte JSON-Konverter von Spring, daher verwendet Spring ihn zuerst für JSON-bezogene Konvertierungen.

<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>
Nach dem Login kopieren

Dann können mehrere Datums- und Uhrzeittypen in Java8 normal und benutzerfreundlich angezeigt werden. Der Vorteil besteht darin, dass Typen wie Datum und Uhrzeit global und einheitlich verwaltet werden, der Nachteil besteht jedoch darin, dass ein bestimmtes Feld im POJO speziell verarbeitet wird.

Oben finden Sie eine ausführliche Erklärung zur Lösung des Formatierungsproblems, bei dem SpringMVC Java8-Zeit-JSON-Daten zurückgibt. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn). !


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage