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" } }
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>
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; }
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
/** * 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)); } }
Ändern Sie dann in der SpringMVC-Konfigurationsdatei
<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>
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). !