Maison > Java > javaDidacticiel > Explication détaillée de la façon de résoudre le problème de formatage de SpringMVC renvoyant les données JSON de l'heure Java8

Explication détaillée de la façon de résoudre le problème de formatage de SpringMVC renvoyant les données JSON de l'heure Java8

黄舟
Libérer: 2017-03-07 10:03:08
original
2262 Les gens l'ont consulté

Cet article présente principalement comment résoudre le problème de formatage de SpringMVC renvoyant des données JSON en temps Java8. L'éditeur pense que c'est assez bon, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur et jetons un coup d'œil

Parfois, l'annotation @ResponseBody est utilisée lors du renvoi d'une réponse au format JSON dans Spring MVC, mais elle sera très gênante lors du traitement du temps en java8. Généralement, le HTTPMessageConverter que nous utilisons. est MappingJackson2HttpMessageConverter, le format d'heure qu'il renvoie par défaut est le suivant :

"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"
  }
 }
Copier après la connexion

Mais nous ne reviendrons pas cela au front-end, pensez-y LocalDate Le format à renvoyer est 2016-11-26 et le format que LocalDateTime souhaite renvoyer est des données telles que 2016-11-26 21:04:34. A travers une recherche de projet et la consultation d'informations pertinentes, voici deux manières de le mettre en œuvre dans une recherche personnelle.

Solution 1 :

S'il s'agit d'un projet maven, introduisez le package jar suivant dans le pom :

<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
   <version>2.8.5</version>
 </dependency>
Copier après la connexion

Ajoutez ensuite une annotation @JsonSerializer sur la fonction get du champ POJO que vous souhaitez JSONiser, comme suit

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;
  }
Copier après la connexion

L'avantage de cette méthode est que différentes méthodes d'affichage peuvent être définies pour des types de domaines spécifiques. Cependant, l'avantage est aussi un inconvénient, car chaque attribut de date doit être ajouté manuellement. L'attribut est généralement nécessaire et il est nécessaire d'introduire un package jar supplémentaire de jsr310.

Solution 2 :

Héritez ObjectMapper pour renvoyer la chaîne json. MappingJackson2HttpMessageConverter utilise principalement ObjectMapper pour renvoyer des chaînes json. Ici, nous écrivons une classe JsonUtil, obtenons l'ObjectMapper pour enregistrer le JsonSerializer correspondant pour la nouvelle API de date et d'heure dans java8.

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

  }

}
Copier après la connexion

Ensuite, dans le fichier de configuration springmvc, remplacez par la configuration suivante, configurez un nouveau convertisseur json. définit son objet ObjectMapper sur l'objet objectMapper dans JsonUtil. Ce convertisseur a une priorité plus élevée que le convertisseur json intégré de Spring, donc Spring l'utilisera en premier pour les conversions liées à 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>
Copier après la connexion

Ensuite, plusieurs types de date et d'heure dans java8 peuvent être affichés normalement et de manière conviviale. L'avantage est que les types tels que la date et l'heure sont gérés de manière globale et uniforme, mais l'inconvénient est qu'un certain champ du POJO est spécialement traité.

Ce qui précède est une explication détaillée de la façon de résoudre le problème de formatage de SpringMVC renvoyant des données JSON en temps Java8. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn). !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal