Dans les projets, nous avons souvent des scènes de conversion de l'heure front-end et back-end, telles que l'heure de création, l'heure de mise à jour, etc. Généralement, les frontaux et les back-ends utilisent l’horodatage ou le format année, mois et jour pour la transmission.前 Si le back-end reçoit les paramètres front-end, ils sont transformés manuellement dans le format souhaité à chaque fois, et le back-end traite manuellement les données vers le front-end. Il est trop difficile de les traiter manuellement au format souhaité. .
Introduction à la solution
1.application/x-www-form-urlencoded et multipart/form-data
Certaines personnes disent qu'il peut être configuré comme ceci :
spring:
jackson: format de date : aaaa-MM-jj HH:mm:ss
fuseau horaire : GMT+8
sérialisation :
write-dates-as-timestamps : false
Cette configuration s'applique uniquement à Date, pas à LocalDateTime, etc.
Ne pas utiliser @RequestBody
package com.example.config;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import java.beans.PropertyEditorSupport;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
@ControllerAdvice
public class LocalDateTimeAdvice {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(LocalDateTime.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
});
binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd")));
}
});
binder.registerCustomEditor(LocalTime.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(LocalTime.parse(text, DateTimeFormatter.ofPattern("HH:mm:ss")));
}
});
}
}
package com.example.business.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
public class User {
private Long id;
private String userName;
private LocalDateTime createTime;
}
package com.example.business.controller;
import com.example.business.entity.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("user")
public class UserController {
@PostMapping("save")
public User save(User user) {
System.out.println("保存用户:" + user);
return user;
}
}
visite du facteur : http://localhost : 8080/user/save?userName=Tony&createTime=2021-09-16 21:13:21
résultats postman :
Résultats backend :
Option 2 : Convertisseur de paramètres personnalisés (Convertisseur)
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Configuration
public class LocalDateTimeConfig {
@Bean
public Converter<String, LocalDateTime> localDateTimeConverter() {
return new LocalDateTimeConverter();
}
public static class LocalDateTimeConverter implements Converter<String, LocalDateTime> {
@Override
public LocalDateTime convert(String s) {
return LocalDateTime.parse(s, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
}
package com.example.business.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
public class User {
private Long id;
private String userName;
private LocalDateTime createTime;
}
package com.example.business.controller;
import com.example.business.entity.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("user")
public class UserController {
@PostMapping("save")
public User save(User user) {
System.out.println("保存用户:" + user);
return user;
}
}
visite du facteur http://localhost:8080/user/save?userName=Tony&createTime= 20 21-09- 16 21:13:21
résultats postman :
Résultats du backend
Utiliser @RequestBody
Cette méthode doit configurer ObjectMapper et Entity doit également ajouter @JsonFormat. "Classe de configuration" Enregistrer l'utilisateur : User(id=null, userName=Tony, createTime= 2021 -09-16T21:13:21)
Option 2 : Jackson2ObjectMapperBuilderCustomizerpackage com.knife.example.config;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.DateDeserializers;
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import lombok.SneakyThrows;
import org.springframework.boot.autoconfigure.jackson.JacksonProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder,
JacksonProperties jacksonProperties) {
ObjectMapper objectMapper = builder.build();
// 把“忽略重复的模块注册”禁用,否则下面的注册不生效
objectMapper.disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
objectMapper.registerModule(configTimeModule());
// 重新设置为生效,避免被其他地方覆盖
objectMapper.enable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
return objectMapper;
}
private JavaTimeModule configTimeModule() {
JavaTimeModule javaTimeModule = new JavaTimeModule();
String localDateTimeFormat = "yyyy-MM-dd HH:mm:ss";
String localDateFormat = "yyyy-MM-dd";
String localTimeFormat = "HH:mm:ss";
String dateFormat = "yyyy-MM-dd HH:mm:ss";
// 序列化
javaTimeModule.addSerializer(
LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(localDateTimeFormat)));
javaTimeModule.addSerializer(
LocalDate.class,
new LocalDateSerializer(DateTimeFormatter.ofPattern(localDateFormat)));
javaTimeModule.addSerializer(
LocalTime.class,
new LocalTimeSerializer(DateTimeFormatter.ofPattern(localTimeFormat)));
javaTimeModule.addSerializer(
Date.class,
new DateSerializer(false, new SimpleDateFormat(dateFormat)));
// 反序列化
javaTimeModule.addDeserializer(
LocalDateTime.class,
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(localDateTimeFormat)));
javaTimeModule.addDeserializer(
LocalDate.class,
new LocalDateDeserializer(DateTimeFormatter.ofPattern(localDateFormat)));
javaTimeModule.addDeserializer(
LocalTime.class,
new LocalTimeDeserializer(DateTimeFormatter.ofPattern(localTimeFormat)));
javaTimeModule.addDeserializer(Date.class, new DateDeserializers.DateDeserializer(){
@SneakyThrows
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext dc){
String text = jsonParser.getText().trim();
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
return sdf.parse(text);
}
});
return javaTimeModule;
}
}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!