SpringBoot 시간 매개 변수 처리 전체 솔 루 션
7975 단어 SpringBoot시간 매개 변수
예 를 들 어 한 사용자 의 만 료 시간 을 설정 하고 전단 은 도대체 어떤 형식 으로 파 라 메 터 를 전달 합 니까?타임 스탬프?아니면 2019-12-01 22:13:00 이런 격식?아니면 다른 형식?
오늘 은 SpringBoot Web 응용 인터페이스 수신 시간 유형 매개 변수 에 대한 문제 해결 방안 을 정리 하 겠 습 니 다.
주:현재 저 는 Spring 소스 코드 에 대한 파악 이 아직 좋 지 않 기 때문에 이 편 은 해결 방법 만 정리 하고 나중에 많이 깨 달 으 면 다시 쓰 겠 습 니 다!
예제 코드 로 이동 하 십시오:https://github.com/laolunsi/spring-boot-examples
간단 한 테스트 를 통 해 우 리 는 알 고 있다.
하지만 한계 가 많다.
이상 적 인 해결 방안 은:한 번 의 설정,전역 적 으로 통용 되 고 다양한 형식,자동 변환(입 에 잘 맞습니다)
1.소스 코드 요약 분석
우선 소스 코드 를 간단하게 분석 해 보 겠 습 니 다.
깊이 들 어가 면 설명 안 해.🤦♂️)
쉽게 말 하면 인터페이스 에서 받 은 인 자 는 먼저 HandlerMethodArgument Resolver 의 실현 클래스 에 의 해 처리 되 었 고 이 를 우리 가 필요 로 하 는 형식 으로 바 꾸 었 다.
여 기 는 주로 두 가지 상황 으로 나 뉜 다.
해결 방법
첫 번 째 상황 에 대해 우 리 는 converter 를 설정 해 야 합 니 다.여기 서 두 가지 방법 을 소개 합 니 다.
우 리 는 세 가지 처리 형식 을 정의 했다.
/**
*
* 、 、 Date
*/
/*@Deprecated*/
public class DateConverter implements Converter<String, Date> {
private Logger logger = LoggerFactory.getLogger(DateConverter.class);
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final String shortDateFormat = "yyyy-MM-dd";
private static final String timeStampFormat = "^\\d+$";
@Override
public Date convert(String value) {
logger.info(" :" + value);
if(value == null || value.trim().equals("") || value.equalsIgnoreCase("null")) {
return null;
}
value = value.trim();
try {
if (value.contains("-")) {
SimpleDateFormat formatter;
if (value.contains(":")) {
formatter = new SimpleDateFormat(dateFormat);
} else {
formatter = new SimpleDateFormat(shortDateFormat);
}
return formatter.parse(value);
} else if (value.matches(timeStampFormat)) {
Long lDate = new Long(value);
return new Date(lDate);
}
} catch (Exception e) {
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
}
주:이 DateConverter 류 는 아래 에서 모두 사용 합 니 다.
import com.aegis.yqmanagecenter.config.date.DateConverter;
import com.aegis.yqmanagecenter.model.bean.common.JsonResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.core.convert.support.GenericConversionService;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.beans.PropertyEditorSupport;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@ControllerAdvice
public class ControllerHandler {
private Logger logger = LoggerFactory.getLogger(ControllerHandler.class);
@InitBinder
public void initBinder(WebDataBinder binder) {
// 1, converter
GenericConversionService genericConversionService = (GenericConversionService) binder.getConversionService();
if (genericConversionService != null) {
genericConversionService.addConverter(new DateConverter());
}
// 2, , , dateEditor,
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
CustomDateEditor dateEditor = new CustomDateEditor(df, true);
binder.registerCustomEditor(Date.class, dateEditor);
// 3, converter
binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(new DateConverter().convert(text));
}
});
}
}
주:위의 세 가지 방법 은 모두@Controller Advice+@InitBinder 를 이용 하여 시간 매개 변 수 를 설정 하여 처리 합 니 다.그 중에서 1 과 3 은 DateConverter 를 설정 할 수 있 고 방법 2 는 하나의 수 동 으로 형식 을 설정 할 수 있 습 니 다.위 설정 방법 으로 는 JSon 형식 데이터 의 시간 매개 변수 수신 문 제 를 해결 할 수 없습니다.다음은 완전한 해결 방안 인 DateConverter 를 구성 요소 로 등록 하고 Object Mapper 를 사용 하여 시간 매개 변수의 직렬 화(인터페이스 반환 값)와 반 직렬 화 형식(인터페이스 수신 매개 변수)을 설정 합 니 다.
2.2 ObjectMapper 설정 및 전체 솔 루 션
완전한 해결 방안:
/**
*
* @RequestAttribute、@RequestParam @RequestBody
*/
@Configuration
public class DateConfig {
/**
*
*/
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
/**
* Date , RequestParam PathVariable
*/
@Bean
public Converter<String, Date> dateConverter() {
return new DateConverter();
}
/**
* Json , Post json json
* @RequestBody Date
*/
@Bean
public ObjectMapper objectMapper(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
JavaTimeModule javaTimeModule = new JavaTimeModule();
//Date
javaTimeModule.addSerializer(Date.class, new JsonSerializer<Date>() {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
SimpleDateFormat formatter = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
String formattedDate = formatter.format(date);
jsonGenerator.writeString(formattedDate);
}
});
javaTimeModule.addDeserializer(Date.class, new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
return new DateConverter().convert(jsonParser.getText());
}
});
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}
}
참고:약서-Spring 에 서 는 LocalDateTime,LocalDate 등 매개 변 수 를 참조 로 사용 합 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.