Commit 65202db9 authored by liaozan's avatar liaozan 🏀

Refactor datetime converters to support both long and string

parent 727f42ec
...@@ -9,8 +9,7 @@ import java.util.Collections; ...@@ -9,8 +9,7 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.function.Function; import java.util.function.Function;
import static com.schbrain.common.constants.PageConstants.DEFAULT_SEARCH_COUNT; import static com.schbrain.common.constants.PageConstants.*;
import static com.schbrain.common.constants.PageConstants.DEFAULT_TOTAL_COUNT;
/** /**
* @author liaozan * @author liaozan
......
...@@ -14,9 +14,7 @@ import java.util.stream.Stream; ...@@ -14,9 +14,7 @@ import java.util.stream.Stream;
import java.util.stream.StreamSupport; import java.util.stream.StreamSupport;
import static java.util.Collections.emptyList; import static java.util.Collections.emptyList;
import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.*;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.mapping;
/** /**
* @author liaozan * @author liaozan
......
...@@ -6,10 +6,7 @@ import lombok.NoArgsConstructor; ...@@ -6,10 +6,7 @@ import lombok.NoArgsConstructor;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static com.schbrain.common.constants.PageConstants.DEFAULT_PAGE_INDEX; import static com.schbrain.common.constants.PageConstants.*;
import static com.schbrain.common.constants.PageConstants.DEFAULT_PAGE_SIZE;
import static com.schbrain.common.constants.PageConstants.DEFAULT_TOTAL_COUNT;
import static com.schbrain.common.constants.PageConstants.DEFAULT_TOTAL_PAGE_COUNT;
/** /**
* @author liaozan * @author liaozan
......
...@@ -3,7 +3,6 @@ package com.schbrain.common.web; ...@@ -3,7 +3,6 @@ package com.schbrain.common.web;
import com.schbrain.common.web.properties.WebProperties; import com.schbrain.common.web.properties.WebProperties;
import com.schbrain.common.web.servlet.CharacterEncodingServletContextInitializer; import com.schbrain.common.web.servlet.CharacterEncodingServletContextInitializer;
import com.schbrain.common.web.servlet.RequestLoggingFilter; import com.schbrain.common.web.servlet.RequestLoggingFilter;
import com.schbrain.common.web.servlet.RequestWrapperFilter;
import com.schbrain.common.web.servlet.TraceIdInitializeServletListener; import com.schbrain.common.web.servlet.TraceIdInitializeServletListener;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
...@@ -39,12 +38,6 @@ public class ServletComponentConfiguration { ...@@ -39,12 +38,6 @@ public class ServletComponentConfiguration {
return requestContextFilter; return requestContextFilter;
} }
@Bean
@ConditionalOnMissingBean
public RequestWrapperFilter requestWrapperFilter() {
return new RequestWrapperFilter();
}
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@ConditionalOnProperty(value = "schbrain.web.enable-request-logging", havingValue = "true", matchIfMissing = true) @ConditionalOnProperty(value = "schbrain.web.enable-request-logging", havingValue = "true", matchIfMissing = true)
......
...@@ -3,7 +3,7 @@ package com.schbrain.common.web; ...@@ -3,7 +3,7 @@ package com.schbrain.common.web;
import com.schbrain.common.web.argument.BodyParamArgumentResolverWebMvcConfigurer; import com.schbrain.common.web.argument.BodyParamArgumentResolverWebMvcConfigurer;
import com.schbrain.common.web.properties.WebProperties; import com.schbrain.common.web.properties.WebProperties;
import com.schbrain.common.web.result.ResponseBodyHandler; import com.schbrain.common.web.result.ResponseBodyHandler;
import com.schbrain.common.web.support.converter.Jsr310DateTimeWebMvcConfigurer; import com.schbrain.common.web.support.converter.datetime.DateTimeConvertersWebMvcConfigurer;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfigurationPackages; import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
...@@ -43,8 +43,8 @@ public class WebCommonAutoConfiguration { ...@@ -43,8 +43,8 @@ public class WebCommonAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public Jsr310DateTimeWebMvcConfigurer defaultJsr310DateTimeWebMvcConfigurer() { public DateTimeConvertersWebMvcConfigurer defaultDateTimeConvertersWebMvcConfigurer() {
return new Jsr310DateTimeWebMvcConfigurer(); return new DateTimeConvertersWebMvcConfigurer();
} }
@Bean @Bean
......
...@@ -64,18 +64,14 @@ public class BodyParamMethodArgumentResolver extends AbstractNamedValueMethodArg ...@@ -64,18 +64,14 @@ public class BodyParamMethodArgumentResolver extends AbstractNamedValueMethodArg
return objectMapper.constructType(parameterType); return objectMapper.constructType(parameterType);
} }
private JsonNode getRequestBody(NativeWebRequest nativeWebRequest) throws IOException { private JsonNode getRequestBody(NativeWebRequest webRequest) throws IOException {
JsonNode requestBody = (JsonNode) nativeWebRequest.getAttribute(REQUEST_BODY_CACHE, SCOPE_REQUEST); JsonNode requestBody = (JsonNode) webRequest.getAttribute(REQUEST_BODY_CACHE, SCOPE_REQUEST);
if (requestBody == null) { if (requestBody == null) {
HttpServletRequest request = wrapRequest(nativeWebRequest); HttpServletRequest request = wrapIfRequired(webRequest.getNativeRequest(HttpServletRequest.class));
requestBody = objectMapper.readTree(request.getInputStream()); requestBody = objectMapper.readTree(request.getInputStream());
nativeWebRequest.setAttribute(REQUEST_BODY_CACHE, requestBody, SCOPE_REQUEST); webRequest.setAttribute(REQUEST_BODY_CACHE, requestBody, SCOPE_REQUEST);
} }
return requestBody; return requestBody;
} }
private HttpServletRequest wrapRequest(NativeWebRequest request) {
return wrapIfRequired(request.getNativeRequest(HttpServletRequest.class));
}
} }
...@@ -28,10 +28,8 @@ import java.sql.SQLException; ...@@ -28,10 +28,8 @@ import java.sql.SQLException;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import static com.schbrain.common.constants.ResponseCodeConstants.PARAM_INVALID; import static com.schbrain.common.constants.ResponseCodeConstants.*;
import static com.schbrain.common.constants.ResponseCodeConstants.SERVER_ERROR; import static com.schbrain.common.util.support.ValidationMessageBuilder.*;
import static com.schbrain.common.util.support.ValidationMessageBuilder.buildBindingErrorMsg;
import static com.schbrain.common.util.support.ValidationMessageBuilder.buildConstraintViolationErrorMsg;
/** /**
* @author liaozan * @author liaozan
......
...@@ -14,8 +14,7 @@ import javax.servlet.http.HttpServletRequest; ...@@ -14,8 +14,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import static com.schbrain.common.web.utils.RequestContentCachingUtils.getRequestBody; import static com.schbrain.common.web.utils.RequestContentCachingUtils.*;
import static com.schbrain.common.web.utils.RequestContentCachingUtils.wrapIfRequired;
/** /**
* 请求日志拦截器 * 请求日志拦截器
......
package com.schbrain.common.web.servlet;
import org.springframework.boot.web.servlet.filter.OrderedFilter;
import org.springframework.core.Ordered;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import static com.schbrain.common.web.utils.RequestContentCachingUtils.wrapIfRequired;
/**
* @author liaozan
* @since 2023/8/20
*/
public class RequestWrapperFilter extends OncePerRequestFilter implements OrderedFilter {
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
chain.doFilter(wrapIfRequired(request), response);
}
}
package com.schbrain.common.web.support.converter;
import org.springframework.core.convert.converter.Converter;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import static java.time.LocalDateTime.ofInstant;
import static java.time.ZoneId.systemDefault;
/**
* @author liaozan
* @since 2023/8/16
*/
public class Jsr310Converters {
public static List<Converter<?, ?>> getConverters() {
List<Converter<?, ?>> converters = new ArrayList<>();
converters.add(LongToLocalDateConverter.INSTANCE);
converters.add(LongToLocalTimeConverter.INSTANCE);
converters.add(LongToLocalDateTimeConverter.INSTANCE);
converters.add(StringToLocalDateConverter.INSTANCE);
converters.add(StringToLocalTimeConverter.INSTANCE);
converters.add(StringToLocalDateTimeConverter.INSTANCE);
return converters;
}
public enum LongToLocalDateConverter implements Converter<Long, LocalDate> {
INSTANCE;
@Override
public LocalDate convert(Long source) {
return LongToLocalDateTimeConverter.INSTANCE.convert(source).toLocalDate();
}
}
public enum LongToLocalTimeConverter implements Converter<Long, LocalTime> {
INSTANCE;
@Override
public LocalTime convert(Long source) {
return LongToLocalDateTimeConverter.INSTANCE.convert(source).toLocalTime();
}
}
public enum LongToLocalDateTimeConverter implements Converter<Long, LocalDateTime> {
INSTANCE;
@Override
public LocalDateTime convert(Long source) {
return ofInstant(Instant.ofEpochMilli(source), systemDefault());
}
}
public enum StringToLocalDateConverter implements Converter<String, LocalDate> {
INSTANCE;
@Override
public LocalDate convert(String source) {
return StringToLocalDateTimeConverter.INSTANCE.convert(source).toLocalDate();
}
}
public enum StringToLocalTimeConverter implements Converter<String, LocalTime> {
INSTANCE;
@Override
public LocalTime convert(String source) {
return StringToLocalDateTimeConverter.INSTANCE.convert(source).toLocalTime();
}
}
public enum StringToLocalDateTimeConverter implements Converter<String, LocalDateTime> {
INSTANCE;
@Override
public LocalDateTime convert(String source) {
return ofInstant(Instant.ofEpochMilli(Long.parseLong(source)), systemDefault());
}
}
}
package com.schbrain.common.web.support.converter.datetime;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.util.NumberUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.ResolvableType;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.ConditionalGenericConverter;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author liaozan
* @since 2023/9/16
*/
abstract class DateTimeConditionalConverter<T> implements ConditionalGenericConverter {
private final TypeDescriptor targetType;
private final TypeDescriptor stringType = TypeDescriptor.valueOf(String.class);
private final Map<String, DateTimeFormatter> formatters = new ConcurrentHashMap<>();
public DateTimeConditionalConverter() {
this.targetType = TypeDescriptor.valueOf(ResolvableType.forClass(getClass()).getSuperType().getGeneric(0).getRawClass());
}
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return sourceType.isAssignableTo(stringType) && targetType.isAssignableTo(this.targetType);
}
@Override
public Set<ConvertiblePair> getConvertibleTypes() {
return Set.of(new ConvertiblePair(String.class, targetType.getObjectType()));
}
@Override
public T convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
if (source == null) {
return null;
}
return convert((String) source, targetType);
}
protected final T convert(String source, TypeDescriptor targetType) {
if (StringUtils.isBlank(source)) {
return null;
}
if (NumberUtil.isLong(source)) {
return doConvert(Long.parseLong(source));
} else {
DateTimeFormatter formatter = ofPattern(determinePattern(targetType));
return doConvert(source, formatter);
}
}
protected String determinePattern(TypeDescriptor targetType) {
DateTimeFormat annotation = targetType.getAnnotation(DateTimeFormat.class);
String pattern = null;
if (annotation != null) {
pattern = annotation.pattern();
}
if (StringUtils.isBlank(pattern)) {
pattern = defaultPattern();
}
return pattern;
}
protected String defaultPattern() {
return DatePattern.NORM_DATETIME_PATTERN;
}
protected DateTimeFormatter ofPattern(String pattern) {
return formatters.computeIfAbsent(pattern, ignore -> DatePattern.createFormatter(pattern));
}
protected abstract T doConvert(Long source);
protected abstract T doConvert(String source, DateTimeFormatter formatter);
}
package com.schbrain.common.web.support.converter; package com.schbrain.common.web.support.converter.datetime;
import org.springframework.format.FormatterRegistry; import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
...@@ -7,11 +7,14 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; ...@@ -7,11 +7,14 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
* @author liaozan * @author liaozan
* @since 2023/8/16 * @since 2023/8/16
*/ */
public class Jsr310DateTimeWebMvcConfigurer implements WebMvcConfigurer { public class DateTimeConvertersWebMvcConfigurer implements WebMvcConfigurer {
@Override @Override
public void addFormatters(FormatterRegistry registry) { public void addFormatters(FormatterRegistry registry) {
Jsr310Converters.getConverters().forEach(registry::addConverter); registry.addConverter(StringToDateConverter.INSTANCE);
registry.addConverter(StringToLocalTimeConverter.INSTANCE);
registry.addConverter(StringToLocalDateConverter.INSTANCE);
registry.addConverter(StringToLocalDateTimeConverter.INSTANCE);
} }
} }
package com.schbrain.common.web.support.converter.datetime;
import cn.hutool.core.date.DateUtil;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
* @author liaozan
* @since 2023/9/16
*/
class StringToDateConverter extends DateTimeConditionalConverter<Date> {
static final StringToDateConverter INSTANCE = new StringToDateConverter();
@Override
protected Date doConvert(Long source) {
return DateUtil.date(source);
}
@Override
protected Date doConvert(String source, DateTimeFormatter formatter) {
return DateUtil.parse(source, formatter);
}
}
package com.schbrain.common.web.support.converter.datetime;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* @author liaozan
* @since 2023/9/16
*/
class StringToLocalDateConverter extends DateTimeConditionalConverter<LocalDate> {
static final StringToLocalDateConverter INSTANCE = new StringToLocalDateConverter();
@Override
protected String defaultPattern() {
return DatePattern.NORM_DATE_PATTERN;
}
@Override
protected LocalDate doConvert(Long source) {
return LocalDateTimeUtil.of(source).toLocalDate();
}
@Override
protected LocalDate doConvert(String source, DateTimeFormatter formatter) {
return LocalDate.parse(source, formatter);
}
}
package com.schbrain.common.web.support.converter.datetime;
import cn.hutool.core.date.LocalDateTimeUtil;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* @author liaozan
* @since 2023/9/16
*/
class StringToLocalDateTimeConverter extends DateTimeConditionalConverter<LocalDateTime> {
static final StringToLocalDateTimeConverter INSTANCE = new StringToLocalDateTimeConverter();
@Override
protected LocalDateTime doConvert(Long source) {
return LocalDateTimeUtil.of(source);
}
@Override
protected LocalDateTime doConvert(String source, DateTimeFormatter formatter) {
return LocalDateTime.parse(source, formatter);
}
}
package com.schbrain.common.web.support.converter.datetime;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* @author liaozan
* @since 2023/9/16
*/
class StringToLocalTimeConverter extends DateTimeConditionalConverter<LocalTime> {
static final StringToLocalTimeConverter INSTANCE = new StringToLocalTimeConverter();
@Override
protected String defaultPattern() {
return DatePattern.NORM_TIME_PATTERN;
}
@Override
protected LocalTime doConvert(Long source) {
return LocalDateTimeUtil.of(source).toLocalTime();
}
@Override
protected LocalTime doConvert(String source, DateTimeFormatter formatter) {
return LocalTime.parse(source, formatter);
}
}
package com.schbrain.common.web.support.signature;
import cn.hutool.crypto.digest.DigestUtil;
import com.schbrain.common.util.StreamUtils;
import com.schbrain.common.util.TraceIdUtils;
import com.schbrain.common.web.support.BaseHandlerInterceptor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.method.HandlerMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import static cn.hutool.core.text.StrPool.UNDERLINE;
import static com.schbrain.common.web.utils.RequestContentCachingUtils.getRequestBody;
public abstract class AbstractSignatureValidationInterceptor<T extends SignatureContext> extends BaseHandlerInterceptor {
private static final String SCH_APP_KEY = "Sch-App-Key";
private static final String SCH_TIMESTAMP = "Sch-Timestamp";
private static final String SCH_SIGNATURE = "Sch-Signature";
private static final String SCH_EXPIRE_TIME = "Sch-Expire-Time";
@Override
protected boolean preHandle(HttpServletRequest request, HttpServletResponse response, HandlerMethod handler) {
String appKey = request.getHeader(SCH_APP_KEY);
String timestamp = request.getHeader(SCH_TIMESTAMP);
String signature = request.getHeader(SCH_SIGNATURE);
String expireTime = request.getHeader(SCH_EXPIRE_TIME);
String traceId = request.getHeader(TraceIdUtils.TRACE_ID);
if (StringUtils.isNotBlank(traceId)) {
TraceIdUtils.set(traceId);
}
// 空校验
if (StringUtils.isAnyBlank(appKey, timestamp, signature, expireTime)) {
throw new SignatureValidationException("签名参数为空!");
}
// 过期校验
if (System.currentTimeMillis() > Long.parseLong(expireTime)) {
throw new SignatureValidationException("请求信息已过期!");
}
// 获取appSecret
SignatureContext context = getSignatureContext(appKey);
if (null == context || StringUtils.isBlank(context.getAppSecret())) {
throw new SignatureValidationException("appSecret不存在!");
}
String requestUri = request.getRequestURI();
String queryString = request.getQueryString();
String requestBody = getRequestBody(request);
// 校验签名
String calculatedSignature = signParams(requestUri, queryString, requestBody, timestamp, appKey, context.getAppSecret());
if (!Objects.equals(signature, calculatedSignature)) {
throw new SignatureValidationException();
}
SignatureContextUtil.set(context);
return true;
}
@Override
protected void afterCompletion(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception ex) {
SignatureContextUtil.clear();
}
protected String signParams(String requestUri, String queryString, String bodyString, String timestamp, String appKey, String appSecret) {
List<String> params = StreamUtils.filterToList(Arrays.asList(requestUri, queryString, bodyString, timestamp, appKey, appSecret), StringUtils::isNotBlank);
String toSign = StreamUtils.join(params, UNDERLINE);
return DigestUtil.sha256Hex(toSign);
}
protected abstract T getSignatureContext(String appKey);
}
package com.schbrain.common.web.support.signature;
import lombok.Data;
@Data
public class SignatureContext {
private String appKey;
private String appSecret;
}
package com.schbrain.common.web.support.signature;
import java.util.Optional;
import java.util.function.Supplier;
public class SignatureContextUtil {
private static final ThreadLocal<SignatureContext> LOCAL = new InheritableThreadLocal<>();
private static final Supplier<SignatureValidationException> EXCEPTION_SUPPLIER = SignatureValidationException::new;
/**
* 取值
*/
public static <T extends SignatureContext> T get(Class<T> type) {
return type.cast(Optional.ofNullable(LOCAL.get()).orElseThrow(EXCEPTION_SUPPLIER));
}
/**
* 获取appKey
*/
public static String getAppKey() {
return get(SignatureContext.class).getAppKey();
}
/**
* 获取appSecret
*/
public static String getAppSecret() {
return get(SignatureContext.class).getAppSecret();
}
/**
* 赋值
*/
public static <T extends SignatureContext> void set(T signatureContext) {
LOCAL.set(signatureContext);
}
/**
* 移除
*/
public static void clear() {
LOCAL.remove();
}
}
package com.schbrain.common.web.support.signature;
import com.schbrain.common.exception.BaseException;
import static com.schbrain.common.constants.ResponseActionConstants.ALERT;
import static com.schbrain.common.constants.ResponseCodeConstants.PARAM_INVALID;
public class SignatureValidationException extends BaseException {
private static final long serialVersionUID = 7564001466173362458L;
private static final String DEFAULT_ERR_MSG = "签名验证异常";
public SignatureValidationException() {
this(DEFAULT_ERR_MSG);
}
public SignatureValidationException(String message) {
super(message, PARAM_INVALID, ALERT);
}
}
package com.schbrain.common.web.utils; package com.schbrain.common.web.utils;
import com.schbrain.common.util.ValidateUtils; import com.schbrain.common.util.ValidateUtils;
import com.schbrain.common.web.servlet.ContentCachingRequest;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.springframework.web.util.ContentCachingRequestWrapper;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.nio.charset.Charset;
import static org.springframework.http.HttpMethod.POST;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
import static org.springframework.web.util.WebUtils.getNativeRequest; import static org.springframework.web.util.WebUtils.getNativeRequest;
/** /**
...@@ -24,10 +22,10 @@ public class RequestContentCachingUtils { ...@@ -24,10 +22,10 @@ public class RequestContentCachingUtils {
*/ */
public static HttpServletRequest wrapIfRequired(HttpServletRequest request) { public static HttpServletRequest wrapIfRequired(HttpServletRequest request) {
ValidateUtils.notNull(request, "request must not be null"); ValidateUtils.notNull(request, "request must not be null");
if (request instanceof ContentCachingRequest || !isJsonPostRequest(request)) { if (request instanceof ContentCachingRequestWrapper) {
return request; return request;
} else { } else {
return new ContentCachingRequest(request); return new ContentCachingRequestWrapper(request);
} }
} }
...@@ -36,23 +34,20 @@ public class RequestContentCachingUtils { ...@@ -36,23 +34,20 @@ public class RequestContentCachingUtils {
*/ */
@Nullable @Nullable
public static String getRequestBody(HttpServletRequest request) { public static String getRequestBody(HttpServletRequest request) {
return getRequestBody(request, request.getCharacterEncoding()); return getRequestBody(request, Charset.forName(request.getCharacterEncoding()));
} }
/** /**
* Get request body content * Get request body content
*/ */
@Nullable @Nullable
public static String getRequestBody(HttpServletRequest request, String characterEncoding) { public static String getRequestBody(HttpServletRequest request, Charset characterEncoding) {
ContentCachingRequest requestToUse = getNativeRequest(request, ContentCachingRequest.class); ContentCachingRequestWrapper requestToUse = getNativeRequest(request, ContentCachingRequestWrapper.class);
if (requestToUse == null) { if (requestToUse == null) {
return null; return null;
} }
return requestToUse.getContentAsString(characterEncoding); byte[] content = requestToUse.getContentAsByteArray();
} return new String(content, characterEncoding);
private static boolean isJsonPostRequest(HttpServletRequest request) {
return POST.matches(request.getMethod()) && StringUtils.contains(request.getContentType(), APPLICATION_JSON_VALUE);
} }
} }
...@@ -100,8 +100,8 @@ ...@@ -100,8 +100,8 @@
<aliyun-sdk-oss.version>3.17.1</aliyun-sdk-oss.version> <aliyun-sdk-oss.version>3.17.1</aliyun-sdk-oss.version>
<!-- alibabacloud new sdk --> <!-- alibabacloud new sdk -->
<aliyun-java-core.version>0.2.0-beta</aliyun-java-core.version> <aliyun-java-core.version>0.2.1-beta</aliyun-java-core.version>
<aliyun-gateway-pop.version>0.2.0-beta</aliyun-gateway-pop.version> <aliyun-gateway-pop.version>0.2.1-beta</aliyun-gateway-pop.version>
<alibabacloud-sts20150401.version>1.0.3</alibabacloud-sts20150401.version> <alibabacloud-sts20150401.version>1.0.3</alibabacloud-sts20150401.version>
<alibabacloud-oss20190517.version>1.0.2</alibabacloud-oss20190517.version> <alibabacloud-oss20190517.version>1.0.2</alibabacloud-oss20190517.version>
<alibabacloud-vod20170321.version>1.0.6</alibabacloud-vod20170321.version> <alibabacloud-vod20170321.version>1.0.6</alibabacloud-vod20170321.version>
...@@ -110,7 +110,7 @@ ...@@ -110,7 +110,7 @@
<!-- dingtalk --> <!-- dingtalk -->
<alibaba-dingtalk-service-sdk.version>2.0.0</alibaba-dingtalk-service-sdk.version> <alibaba-dingtalk-service-sdk.version>2.0.0</alibaba-dingtalk-service-sdk.version>
<cube-sdk-java.version>1.0.2-RELEASE</cube-sdk-java.version> <cube-sdk-java.version>1.0.2-RELEASE</cube-sdk-java.version>
<dingtalk.version>2.0.35</dingtalk.version> <dingtalk.version>2.0.36</dingtalk.version>
<!-- maven settings --> <!-- maven settings -->
<maven.compiler.showDeprecation>true</maven.compiler.showDeprecation> <maven.compiler.showDeprecation>true</maven.compiler.showDeprecation>
......
...@@ -17,8 +17,7 @@ import java.util.Map; ...@@ -17,8 +17,7 @@ import java.util.Map;
import static com.ctrip.framework.apollo.core.ApolloClientSystemConsts.*; import static com.ctrip.framework.apollo.core.ApolloClientSystemConsts.*;
import static com.ctrip.framework.apollo.core.ConfigConsts.APOLLO_META_KEY; import static com.ctrip.framework.apollo.core.ConfigConsts.APOLLO_META_KEY;
import static com.ctrip.framework.apollo.spring.config.PropertySourcesConstants.APOLLO_BOOTSTRAP_EAGER_LOAD_ENABLED; import static com.ctrip.framework.apollo.spring.config.PropertySourcesConstants.*;
import static com.ctrip.framework.apollo.spring.config.PropertySourcesConstants.APOLLO_BOOTSTRAP_ENABLED;
/** /**
* @author liaozan * @author liaozan
......
...@@ -18,9 +18,7 @@ import java.lang.reflect.Field; ...@@ -18,9 +18,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.Map; import java.util.Map;
import static org.springframework.beans.factory.config.PlaceholderConfigurerSupport.DEFAULT_PLACEHOLDER_PREFIX; import static org.springframework.beans.factory.config.PlaceholderConfigurerSupport.*;
import static org.springframework.beans.factory.config.PlaceholderConfigurerSupport.DEFAULT_PLACEHOLDER_SUFFIX;
import static org.springframework.beans.factory.config.PlaceholderConfigurerSupport.DEFAULT_VALUE_SEPARATOR;
/** /**
* @author liaozan * @author liaozan
......
...@@ -11,8 +11,7 @@ import java.util.List; ...@@ -11,8 +11,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.ctrip.framework.apollo.spring.config.PropertySourcesConstants.APOLLO_BOOTSTRAP_PROPERTY_SOURCE_NAME; import static com.ctrip.framework.apollo.spring.config.PropertySourcesConstants.*;
import static com.ctrip.framework.apollo.spring.config.PropertySourcesConstants.APOLLO_PROPERTY_SOURCE_NAME;
/** /**
* @author liaozan * @author liaozan
......
...@@ -11,8 +11,7 @@ import org.springframework.boot.logging.LoggingSystem; ...@@ -11,8 +11,7 @@ import org.springframework.boot.logging.LoggingSystem;
import java.util.Set; import java.util.Set;
import static com.ctrip.framework.apollo.enums.PropertyChangeType.ADDED; import static com.ctrip.framework.apollo.enums.PropertyChangeType.*;
import static com.ctrip.framework.apollo.enums.PropertyChangeType.MODIFIED;
import static org.springframework.boot.logging.LoggingSystem.ROOT_LOGGER_NAME; import static org.springframework.boot.logging.LoggingSystem.ROOT_LOGGER_NAME;
/** /**
......
...@@ -25,8 +25,7 @@ import java.util.List; ...@@ -25,8 +25,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Supplier; import java.util.function.Supplier;
import static java.util.Collections.emptyList; import static java.util.Collections.*;
import static java.util.Collections.emptyMap;
/** /**
* @author liaozan * @author liaozan
......
...@@ -7,9 +7,7 @@ import lombok.Getter; ...@@ -7,9 +7,7 @@ import lombok.Getter;
import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandle;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import static java.lang.invoke.MethodHandles.Lookup; import static java.lang.invoke.MethodHandles.*;
import static java.lang.invoke.MethodHandles.lookup;
import static java.lang.invoke.MethodHandles.privateLookupIn;
/** /**
* @author liaozan * @author liaozan
......
...@@ -14,9 +14,7 @@ import lombok.extern.slf4j.Slf4j; ...@@ -14,9 +14,7 @@ import lombok.extern.slf4j.Slf4j;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static com.schbrain.framework.autoconfigure.mybatis.constant.MybatisConstants.CREATE_TIME; import static com.schbrain.framework.autoconfigure.mybatis.constant.MybatisConstants.*;
import static com.schbrain.framework.autoconfigure.mybatis.constant.MybatisConstants.DELETE_VERSION;
import static com.schbrain.framework.autoconfigure.mybatis.constant.MybatisConstants.MODIFY_TIME;
/** /**
* @author liaozan * @author liaozan
......
...@@ -21,6 +21,7 @@ import com.schbrain.framework.autoconfigure.oss.bean.*; ...@@ -21,6 +21,7 @@ import com.schbrain.framework.autoconfigure.oss.bean.*;
import com.schbrain.framework.autoconfigure.oss.exception.OssException; import com.schbrain.framework.autoconfigure.oss.exception.OssException;
import com.schbrain.framework.autoconfigure.oss.properties.OssProperties; import com.schbrain.framework.autoconfigure.oss.properties.OssProperties;
import com.schbrain.framework.autoconfigure.oss.properties.OssProperties.StsProperties; import com.schbrain.framework.autoconfigure.oss.properties.OssProperties.StsProperties;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
...@@ -47,6 +48,7 @@ public class OssUtils { ...@@ -47,6 +48,7 @@ public class OssUtils {
private static DefaultAcsClient stsAcsClient; private static DefaultAcsClient stsAcsClient;
@Getter
private static OssProperties ossProperties; private static OssProperties ossProperties;
private static StsProperties stsProperties; private static StsProperties stsProperties;
...@@ -72,10 +74,6 @@ public class OssUtils { ...@@ -72,10 +74,6 @@ public class OssUtils {
} }
} }
public static OssProperties getOssProperties() {
return ossProperties;
}
public static OSSClient getOssClient() { public static OSSClient getOssClient() {
if (ossClient == null) { if (ossClient == null) {
throw new OssException("Oss client is null"); throw new OssException("Oss client is null");
......
...@@ -58,8 +58,8 @@ public class DefaultPropertiesEnvironmentPostProcessor extends LoggerAwareEnviro ...@@ -58,8 +58,8 @@ public class DefaultPropertiesEnvironmentPostProcessor extends LoggerAwareEnviro
// mvc // mvc
defaultProperties.put("spring.mvc.throw-exception-if-no-handler-found", true); defaultProperties.put("spring.mvc.throw-exception-if-no-handler-found", true);
// datetime // datetime
defaultProperties.put("spring.mvc.format.date", DatePattern.NORM_DATE_PATTERN); defaultProperties.put("spring.mvc.format.date", DatePattern.NORM_DATETIME_PATTERN);
defaultProperties.put("spring.mvc.format.time", DatePattern.NORM_TIME_PATTERN); defaultProperties.put("spring.mvc.format.time", DatePattern.NORM_DATETIME_PATTERN);
defaultProperties.put("spring.mvc.format.date-time", DatePattern.NORM_DATETIME_PATTERN); defaultProperties.put("spring.mvc.format.date-time", DatePattern.NORM_DATETIME_PATTERN);
defaultProperties.put("spring.jackson.date-format", DatePattern.NORM_DATETIME_PATTERN); defaultProperties.put("spring.jackson.date-format", DatePattern.NORM_DATETIME_PATTERN);
defaultProperties.put("spring.jackson.time-zone", TimeZone.getDefault().getID()); defaultProperties.put("spring.jackson.time-zone", TimeZone.getDefault().getID());
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment