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
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" } }
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>
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; }
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 JsonSerializer8742468051c85b06f0a0af9e3e506b5c 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)); } }
Ensuite, dans le fichier de configuration springmvc, remplacez f7ba1f27e11c63617ca69c495697dd74 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>
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). !