Commit 6cf6964d by qiuweili123

Merge branch 'dev'

# Conflicts:
#	README.md
#	common-core/pom.xml
#	common-util/pom.xml
#	config-starter/pom.xml
#	dubbo-starter/pom.xml
#	elasticsearch-starter/pom.xml
#	mongodb-starter/pom.xml
#	monitor-starter/pom.xml
#	mybatis-starter/pom.xml
#	openfeign-starter/pom.xml
#	pom.xml
#	redis-starter/pom.xml
#	rocketmq-starter/pom.xml
#	web-starter/pom.xml
parents 3ea20a73 a352c86d
......@@ -24,12 +24,20 @@
* common-\*:通用依赖
* \*-starter:组件依赖
开发版本 1.0.3-DEV-SNAPSHOT
正式版本
1.0.5.RELEASE
1、增加logstater模块
2、修正多语言环境下zh的无法取到错误信息
3、增加rocketmq-starter组件
1.0.4.RELEASE
1\update spring boot to 2.1.6
1、update spring boot to 2.1.6
1.0.3.RELEASE
1、增加monitor traceId监控模块
2、增加防灾冗余
3、优化文件结构
4、增加对controller返回null响应增强
1.0.3.RELEASE
1、增加monitor traceId监控模块
2、增加防灾冗余
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -6,6 +6,7 @@ public interface CommonConstant {
Integer CODE = 0;
String MSG = "success";
}
interface Env {
String LOCAL = "local";
String DEV = "dev";
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......@@ -37,7 +37,6 @@
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
......
package com.secoo.mall.common.util.bean;
import com.google.common.collect.Maps;
import com.secoo.mall.common.core.errorcode.CommonErrorCode;
import com.secoo.mall.common.core.exception.BusinessException;
import com.secoo.mall.common.core.exception.SystemInternalException;
import com.secoo.mall.common.util.json.FastJsonUtil;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.ArrayUtils;
import java.lang.reflect.Field;
import java.util.Map;
public class BeanUtil extends BeanUtils {
private static final String[] DEFUALT_IGNORE_KEY = {"class", "empty"};
public static boolean containsInteger(Integer[] arr, Integer obj) {
return ArrayUtils.contains(arr, obj);
}
......@@ -25,14 +30,23 @@ public class BeanUtil extends BeanUtils {
return field.get(obj);
}
public static <T> T transMap2Bean(Object object, Class<T> classOfT) {
if (object == null || !(object instanceof Map)) {
return null;
public static <T> Map<String, Object> transBean2Map(T object) {
if (object == null) {
return Maps.newHashMapWithExpectedSize(0);
}
try {
return PropertyUtils.describe(object);
} catch (Exception e) {
throw new SystemInternalException();
}
}
public static <T> T transMap2Bean(Map<String, Object> object, Class<T> classOfT) {
String tmp = FastJsonUtil.toString(object);
return FastJsonUtil.toBean(tmp, classOfT);
}
public static void copyProps(Object dest, Object orig) {
try {
copyProperties(dest, orig);
......
......@@ -3,8 +3,8 @@ package com.secoo.mall.common.util.checker;
import com.secoo.mall.common.core.errorcode.ErrorCode;
import com.secoo.mall.common.core.exception.ParameterException;
import com.secoo.mall.common.util.decimal.DecimalUtil;
import com.secoo.mall.common.util.colletion.MapUtil;
import com.secoo.mall.common.util.decimal.DecimalUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
......
......@@ -2,5 +2,5 @@ package com.secoo.mall.common.util.file;
import org.apache.commons.io.IOUtils;
public class IOUtil extends IOUtils {
public class IOUtil extends IOUtils {
}
......@@ -5,7 +5,7 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -11,5 +11,4 @@ import org.springframework.context.annotation.Configuration;
public class ApolloAutoConfiguration {
}
......@@ -5,7 +5,7 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>logger-starter</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<logback.version>1.2.3</logback.version>
<slf4j.version>1.7.25</slf4j.version>
<janino.version>3.0.6</janino.version>
</properties>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- 桥接slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- 支持logback condition表达式 -->
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>${janino.version}</version>
</dependency>
<!-- 打印skywalking tid插件-->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>6.2.1-beta.RELEASE</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd"> -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property resource="log.properties"/>
<springProperty scope="context" name="logLevel" source="log.level" defaultValue="info"/>
<springProperty scope="context" name="logName" source="spring.application.name" defaultValue="app"/>
<springProperty scope="context" name="logPath" source="log.path" defaultValue="/data/logs"/>
<springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>
<property name="LOG_DIR" value="${logPath}/${logName}/%d{yyyyMMdd}"/>
<property name="MAX_FILE_SIZE" value="128MB"/>
<property name="MAX_HISTORY" value="7"/>
<property name="PATTERN" value="-|%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%X{traceId}|%thread|%logger{36}.%M:%L-%msg%n"/>
<property name="LOG_PATH" value="/data/logs"/>
<property name="LOG_DIR" value="${LOG_PATH}/${logName}/%d{yyyyMMdd}"/>
<property name="MAX_FILE_SIZE" value="${logFileSize}"/>
<property name="MAX_HISTORY" value="${logMaxHistory}"/>
<property name="PATTERN" value="-|%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%X{tid}|%thread|%logger{36}.%M:%L-%msg%n"/>
<property name="CHARSET" value="UTF-8"/>
<jmxConfigurator/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${PATTERN}</pattern>
</layout>
</appender>
<appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender"></appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
......@@ -28,7 +18,7 @@
<onMismatch>DENY</onMismatch>
</filter>
<!-- 定义文件的名称 -->
<file>${logPath}/${logName}/error.log</file>
<file>${LOG_PATH}/${logName}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_DIR}/err_${logName}%i.log</FileNamePattern>
<MaxHistory>${MAX_HISTORY}</MaxHistory>
......@@ -36,14 +26,14 @@
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>${PATTERN}</Pattern>
</layout>
</appender>
<appender name="APP" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 定义文件的名称 -->
<file>${logPath}/${logName}/app.log</file>
<file>${LOG_PATH}/${logName}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_DIR}/all_${logName}%i.log</FileNamePattern>
<MaxHistory>${MAX_HISTORY}</MaxHistory>
......@@ -51,7 +41,7 @@
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<pattern>${PATTERN}</pattern>
</layout>
</appender>
......@@ -60,11 +50,13 @@
<appender-ref ref="APP"/>
<queueSize>1024</queueSize>
<neverBlock>true</neverBlock>
<includeCallerData>true</includeCallerData>
</appender>
<appender name="ASYN_ERROR" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="ERROR"/>
<queueSize>256</queueSize>
<neverBlock>true</neverBlock>
<includeCallerData>true</includeCallerData>
</appender>
......@@ -74,9 +66,12 @@
<logger name="error" level="${logLevel}">
<appender-ref ref="ASYN_ERROR"/>
</logger>
<!-- 日志排除 -->
<logger name="org.logicalcobwebs.proxool" level="error"/>
<!--统一日志输出级别,其他appender中如果有高于此处等级设置的也会被输出 -->
<root level="${logLevel}">
<appender-ref ref="${STDOUT}"/>
<appender-ref ref="ASYN_APP"/>
<appender-ref ref="ASYN_ERROR"/>
</root>
......
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd"> -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
<!-- <property name="LOG_HOME" value="./log" /> -->
<!--取得spring boot中的变量值有2种方式,一种是resource,另外一种是使用springProperty,使用springProperty好处能指定默认值-->
<!-- <property resource="application.properties"/>
-->
<springProperty scope="context" name="logLevel" source="log.level" defaultValue="info"/>
<springProperty scope="context" name="logName" source="spring.application.name" defaultValue="app"/>
<springProperty scope="context" name="logPath" source="logging.path" defaultValue="/data/logs"/>
<springProperty scope="context" name="immediateFlush" source="log.immediateFlush" defaultValue="true"/>
<springProperty scope="context" name="logLevel" source="log.level" defaultValue="info"/>
<springProperty scope="context" name="LOG_PATH" source="log.path" defaultValue="/data/logs"/>
<springProperty scope="context" name="MAX_FILE_SIZE" source="log.max_file_size" defaultValue="128MB"/>
<springProperty scope="context" name="MAX_HISTORY" source="log.max_history" defaultValue="7"/>
<springProperty scope="context" name="PATTERN" source="log.pattern"
defaultValue="-|%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%X{tid}|%thread|%logger{36}.%M:%L-%msg%n"/>
<springProfile name="test,dev,local">
<springProperty scope="context" name="logPath" source="logging.path" defaultValue="./logs"/>
</springProfile>
<property name="PATTERN"
value="-|%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%X{traceId}|%thread|%logger{36}|%msg%n"/>
<property name="LOG_DIR" value="${LOG_PATH}/${logName}/%d{yyyyMMdd}"/>
<property name="CHARSET" value="UTF-8"/>
<jmxConfigurator/>
<!-- 控制台输出 -->
......@@ -30,8 +23,8 @@
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<immediateFlush>false</immediateFlush>
</appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level> <!-- 只记录error级别的日志 -->
......@@ -39,72 +32,73 @@
<onMismatch>DENY</onMismatch>
</filter>
<!-- 定义文件的名称 -->
<file>${logPath}/${logName}/error.log
</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- rollover daily -->
<!-- 设置达到指定大小限制后输出的日志名称 -->
<fileNamePattern>${logPath}/${logName}/error-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<file>${LOG_PATH}/${logName}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_DIR}/err_${logName}%i.log</FileNamePattern>
<MaxHistory>${MAX_HISTORY}</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>${PATTERN}</Pattern>
</layout>
</appender>
<appender name="APP" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 定义文件的名称 -->
<file>${logPath}/${logName}/app.log
</file>
<file>${LOG_PATH}/${logName}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<!-- 设置达到指定大小限制后输出的日志名称 -->
<fileNamePattern>${logPath}/${logName}/app-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<FileNamePattern>${LOG_DIR}/all_${logName}%i.log</FileNamePattern>
<MaxHistory>${MAX_HISTORY}</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<immediateFlush>${immediateFlush}</immediateFlush>
</layout>
</appender>
<appender name="ASYN_STDOUT" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="STDOUT"/>
<queueSize>256</queueSize>
<neverBlock>true</neverBlock>
<includeCallerData>true</includeCallerData>
</appender>
<appender name="ASYN_APP" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="APP"/>
<queueSize>1024</queueSize>
<neverBlock>true</neverBlock>
<includeCallerData>true</includeCallerData>
</appender>
<appender name="ASYN_ERROR" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="ERROR"/>
<queueSize>256</queueSize>
<neverBlock>true</neverBlock>
</appender>
<!-- <appender name="ASYN_EMAIL" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="EMAIL"/>
<queueSize>256</queueSize>
<neverBlock>true</neverBlock>
</appender>-->
<appender name="ASYN_STDOUT" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="STDOUT"/>
<queueSize>256</queueSize>
<neverBlock>true</neverBlock>
<includeCallerData>true</includeCallerData>
</appender>
<logger name="app" level="${logLevel}">
<appender-ref ref="ASYN_APP"/>
</logger>
<logger name="error" level="${logLevel}">
<appender-ref ref="ASYN_ERROR"/>
</logger>
<!-- 日志排除 -->
<logger name="org.logicalcobwebs.proxool" level="error"/>
<!--统一日志输出级别,其他appender中如果有高于此处等级设置的也会被输出 -->
<root level="${logLevel}">
<!-- <appender-ref ref="ASYN_EMAIL"/>-->
<springProfile name="test,dev,local">
<appender-ref ref="ASYN_STDOUT"/>
</springProfile>
<appender-ref ref="ASYN_APP"/>
<appender-ref ref="ASYN_ERROR"/>
</root>
</configuration>
\ No newline at end of file
......@@ -5,7 +5,7 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -4,7 +4,7 @@ package com.secoo.matrix.monitor.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MonitorAutoConfiguration {
public class MonitorAutoConfiguration {
}
}
......@@ -35,11 +35,7 @@ public interface MonitorConstant {
String ROLE = "Dubbo-RPC";
String ERROR_MSG="errorMsg";
String ERROR_MSG = "errorMsg";
}
......@@ -19,7 +19,7 @@ public class HttpTraceFilter implements Filter {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
try {
TraceIDUtils.continueTraceID();
filterChain.doFilter(servletRequest,servletResponse);
filterChain.doFilter(servletRequest, servletResponse);
} catch (Exception e) {
}
}
......
......@@ -27,7 +27,6 @@ public class TraceInterceptor extends HandlerInterceptorAdapter {
private ThreadLocal<Long> stime = new ThreadLocal<>();
/**
* This implementation always returns {@code true}.
*/
......@@ -42,7 +41,7 @@ public class TraceInterceptor extends HandlerInterceptorAdapter {
// // 并发计数
// getConcurrent(request).incrementAndGet();
}catch (Exception e){//容灾
} catch (Exception e) {//容灾
}
return true;
}
......@@ -62,12 +61,12 @@ public class TraceInterceptor extends HandlerInterceptorAdapter {
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
try {
MDC.clear();
try {
MDC.clear();
getConcurrent(request).decrementAndGet();
}catch (Exception e){
}
getConcurrent(request).decrementAndGet();
} catch (Exception e) {
}
}
// 获取并发计数器
......
......@@ -6,392 +6,374 @@ import java.security.SecureRandom;
import java.util.UUID;
public final class UUIDUtils implements java.io.Serializable,
Comparable<UUIDUtils> {
/**
* Explicit serialVersionUID for interoperability.
*/
private static final long serialVersionUID = -4856846361193249489L;
/*
* The most significant 64 bits of this UUID.
*
* @serial
*/
private final long mostSigBits;
/*
* The least significant 64 bits of this UUID.
*
* @serial
*/
private final long leastSigBits;
/*
* The random number generator used by this class to create random based
* UUIDs. In a holder class to defer initialization until needed.
*/
private static class Holder {
static final SecureRandom numberGenerator = new SecureRandom();
}
// Constructors and Factories
/*
* Private constructor which uses a byte array to construct the new UUID.
*/
private UUIDUtils(byte[] data) {
long msb = 0;
long lsb = 0;
assert data.length == 16 : "data must be 16 bytes in length";
for (int i = 0; i < 8; i++) {
Comparable<UUIDUtils> {
/**
* Explicit serialVersionUID for interoperability.
*/
private static final long serialVersionUID = -4856846361193249489L;
/*
* The most significant 64 bits of this UUID.
*
* @serial
*/
private final long mostSigBits;
/*
* The least significant 64 bits of this UUID.
*
* @serial
*/
private final long leastSigBits;
/*
* The random number generator used by this class to create random based
* UUIDs. In a holder class to defer initialization until needed.
*/
private static class Holder {
static final SecureRandom numberGenerator = new SecureRandom();
}
// Constructors and Factories
/*
* Private constructor which uses a byte array to construct the new UUID.
*/
private UUIDUtils(byte[] data) {
long msb = 0;
long lsb = 0;
assert data.length == 16 : "data must be 16 bytes in length";
for (int i = 0; i < 8; i++) {
msb = (msb << 8) | (data[i] & 0xff);
}
for (int i = 8; i < 16; i++) {
for (int i = 8; i < 16; i++) {
lsb = (lsb << 8) | (data[i] & 0xff);
}
this.mostSigBits = msb;
this.leastSigBits = lsb;
}
/**
* Constructs a new {@code UUID} using the specified data.
* {@code mostSigBits} is used for the most significant 64 bits of the
* {@code UUID} and {@code leastSigBits} becomes the least significant 64
* bits of the {@code UUID}.
*
* @param mostSigBits
* The most significant bits of the {@code UUID}
*
* @param leastSigBits
* The least significant bits of the {@code UUID}
*/
public UUIDUtils(long mostSigBits, long leastSigBits) {
this.mostSigBits = mostSigBits;
this.leastSigBits = leastSigBits;
}
/**
* Static factory to retrieve a type 4 (pseudo randomly generated) UUID.
*
* The {@code UUID} is generated using a cryptographically strong pseudo
* random number generator.
*
* @return A randomly generated {@code UUID}
*/
public static UUIDUtils randomUUID() {
SecureRandom ng = Holder.numberGenerator;
byte[] randomBytes = new byte[16];
ng.nextBytes(randomBytes);
randomBytes[6] &= 0x0f; /* clear version */
randomBytes[6] |= 0x40; /* set to version 4 */
randomBytes[8] &= 0x3f; /* clear variant */
randomBytes[8] |= 0x80; /* set to IETF variant */
return new UUIDUtils(randomBytes);
}
/**
* Static factory to retrieve a type 3 (name based) {@code UUID} based on
* the specified byte array.
*
* @param name
* A byte array to be used to construct a {@code UUID}
*
* @return A {@code UUID} generated from the specified array
*/
public static UUIDUtils nameUUIDFromBytes(byte[] name) {
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nsae) {
throw new InternalError("MD5 not supported", nsae);
}
byte[] md5Bytes = md.digest(name);
md5Bytes[6] &= 0x0f; /* clear version */
md5Bytes[6] |= 0x30; /* set to version 3 */
md5Bytes[8] &= 0x3f; /* clear variant */
md5Bytes[8] |= 0x80; /* set to IETF variant */
return new UUIDUtils(md5Bytes);
}
/**
* Creates a {@code UUID} from the string standard representation as
* described in the {@link #toString} method.
*
* @param name
* A string that specifies a {@code UUID}
*
* @return A {@code UUID} with the specified value
*
* @throws IllegalArgumentException
* If name does not conform to the string representation as
* described in {@link #toString}
*
*/
public static UUIDUtils fromString(String name) {
String[] components = name.split("-");
if (components.length != 5) {
this.mostSigBits = msb;
this.leastSigBits = lsb;
}
/**
* Constructs a new {@code UUID} using the specified data.
* {@code mostSigBits} is used for the most significant 64 bits of the
* {@code UUID} and {@code leastSigBits} becomes the least significant 64
* bits of the {@code UUID}.
*
* @param mostSigBits The most significant bits of the {@code UUID}
* @param leastSigBits The least significant bits of the {@code UUID}
*/
public UUIDUtils(long mostSigBits, long leastSigBits) {
this.mostSigBits = mostSigBits;
this.leastSigBits = leastSigBits;
}
/**
* Static factory to retrieve a type 4 (pseudo randomly generated) UUID.
* <p>
* The {@code UUID} is generated using a cryptographically strong pseudo
* random number generator.
*
* @return A randomly generated {@code UUID}
*/
public static UUIDUtils randomUUID() {
SecureRandom ng = Holder.numberGenerator;
byte[] randomBytes = new byte[16];
ng.nextBytes(randomBytes);
randomBytes[6] &= 0x0f; /* clear version */
randomBytes[6] |= 0x40; /* set to version 4 */
randomBytes[8] &= 0x3f; /* clear variant */
randomBytes[8] |= 0x80; /* set to IETF variant */
return new UUIDUtils(randomBytes);
}
/**
* Static factory to retrieve a type 3 (name based) {@code UUID} based on
* the specified byte array.
*
* @param name A byte array to be used to construct a {@code UUID}
* @return A {@code UUID} generated from the specified array
*/
public static UUIDUtils nameUUIDFromBytes(byte[] name) {
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nsae) {
throw new InternalError("MD5 not supported", nsae);
}
byte[] md5Bytes = md.digest(name);
md5Bytes[6] &= 0x0f; /* clear version */
md5Bytes[6] |= 0x30; /* set to version 3 */
md5Bytes[8] &= 0x3f; /* clear variant */
md5Bytes[8] |= 0x80; /* set to IETF variant */
return new UUIDUtils(md5Bytes);
}
/**
* Creates a {@code UUID} from the string standard representation as
* described in the {@link #toString} method.
*
* @param name A string that specifies a {@code UUID}
* @return A {@code UUID} with the specified value
* @throws IllegalArgumentException If name does not conform to the string representation as
* described in {@link #toString}
*/
public static UUIDUtils fromString(String name) {
String[] components = name.split("-");
if (components.length != 5) {
throw new IllegalArgumentException("Invalid UUID string: " + name);
}
for (int i = 0; i < 5; i++) {
for (int i = 0; i < 5; i++) {
components[i] = "0x" + components[i];
}
long mostSigBits = Long.decode(components[0]).longValue();
mostSigBits <<= 16;
mostSigBits |= Long.decode(components[1]).longValue();
mostSigBits <<= 16;
mostSigBits |= Long.decode(components[2]).longValue();
long leastSigBits = Long.decode(components[3]).longValue();
leastSigBits <<= 48;
leastSigBits |= Long.decode(components[4]).longValue();
return new UUIDUtils(mostSigBits, leastSigBits);
}
// Field Accessor Methods
/**
* Returns the least significant 64 bits of this UUID's 128 bit value.
*
* @return The least significant 64 bits of this UUID's 128 bit value
*/
public long getLeastSignificantBits() {
return leastSigBits;
}
/**
* Returns the most significant 64 bits of this UUID's 128 bit value.
*
* @return The most significant 64 bits of this UUID's 128 bit value
*/
public long getMostSignificantBits() {
return mostSigBits;
}
/**
* The version number associated with this {@code UUID}. The version number
* describes how this {@code UUID} was generated.
*
* The version number has the following meaning:
* <ul>
* <li>1 Time-based UUID
* <li>2 DCE security UUID
* <li>3 Name-based UUID
* <li>4 Randomly generated UUID
* </ul>
*
* @return The version number of this {@code UUID}
*/
public int version() {
// Version is bits masked by 0x000000000000F000 in MS long
return (int) ((mostSigBits >> 12) & 0x0f);
}
/**
* The variant number associated with this {@code UUID}. The variant number
* describes the layout of the {@code UUID}.
*
* The variant number has the following meaning:
* <ul>
* <li>0 Reserved for NCS backward compatibility
* <li>2 <a
* href="http://www.ietf.org/rfc/rfc4122.txt">IETF&nbsp;RFC&nbsp;4122</a>
* (Leach-Salz), used by this class
* <li>6 Reserved, Microsoft Corporation backward compatibility
* <li>7 Reserved for future definition
* </ul>
*
* @return The variant number of this {@code UUID}
*/
public int variant() {
// This field is composed of a varying number of bits.
// 0 - - Reserved for NCS backward compatibility
// 1 0 - The IETF aka Leach-Salz variant (used by this class)
// 1 1 0 Reserved, Microsoft backward compatibility
// 1 1 1 Reserved for future definition.
return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63));
}
/**
* The timestamp value associated with this UUID.
*
* <p>
* The 60 bit timestamp value is constructed from the time_low, time_mid,
* and time_hi fields of this {@code UUID}. The resulting timestamp is
* measured in 100-nanosecond units since midnight, October 15, 1582 UTC.
*
* <p>
* The timestamp value is only meaningful in a time-based UUID, which has
* version type 1. If this {@code UUID} is not a time-based UUID then this
* method throws UnsupportedOperationException.
*
* @throws UnsupportedOperationException
* If this UUID is not a version 1 UUID
* @return The timestamp of this {@code UUID}.
*/
public long timestamp() {
if (version() != 1) {
throw new UnsupportedOperationException("Not a time-based UUID");
}
return (mostSigBits & 0x0FFFL) << 48
| ((mostSigBits >> 16) & 0x0FFFFL) << 32 | mostSigBits >>> 32;
}
/**
* The clock sequence value associated with this UUID.
*
* <p>
* The 14 bit clock sequence value is constructed from the clock sequence
* field of this UUID. The clock sequence field is used to guarantee
* temporal uniqueness in a time-based UUID.
*
* <p>
* The {@code clockSequence} value is only meaningful in a time-based UUID,
* which has version type 1. If this UUID is not a time-based UUID then this
* method throws UnsupportedOperationException.
*
* @return The clock sequence of this {@code UUID}
*
* @throws UnsupportedOperationException
* If this UUID is not a version 1 UUID
*/
public int clockSequence() {
if (version() != 1) {
throw new UnsupportedOperationException("Not a time-based UUID");
}
return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48);
}
/**
* The node value associated with this UUID.
*
* <p>
* The 48 bit node value is constructed from the node field of this UUID.
* This field is intended to hold the IEEE 802 address of the machine that
* generated this UUID to guarantee spatial uniqueness.
*
* <p>
* The node value is only meaningful in a time-based UUID, which has version
* type 1. If this UUID is not a time-based UUID then this method throws
* UnsupportedOperationException.
*
* @return The node value of this {@code UUID}
*
* @throws UnsupportedOperationException
* If this UUID is not a version 1 UUID
*/
public long node() {
if (version() != 1) {
throw new UnsupportedOperationException("Not a time-based UUID");
}
return leastSigBits & 0x0000FFFFFFFFFFFFL;
}
// Object Inherited Methods
/**
* Returns a {@code String} object representing this {@code UUID}.
*
* <p>
* The UUID string representation is as described by this BNF: <blockquote>
*
* <pre>
* {@code
* UUID = <time_low> "-" <time_mid> "-"
* <time_high_and_version> "-"
* <variant_and_sequence> "-"
* <node>
* time_low = 4*<hexOctet>
* time_mid = 2*<hexOctet>
* time_high_and_version = 2*<hexOctet>
* variant_and_sequence = 2*<hexOctet>
* node = 6*<hexOctet>
* hexOctet = <hexDigit><hexDigit>
* hexDigit =
* "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
* | "a" | "b" | "c" | "d" | "e" | "f"
* | "A" | "B" | "C" | "D" | "E" | "F"
* }
* </pre>
*
* </blockquote>
*
* @return A string representation of this {@code UUID}
*/
@Override
long mostSigBits = Long.decode(components[0]).longValue();
mostSigBits <<= 16;
mostSigBits |= Long.decode(components[1]).longValue();
mostSigBits <<= 16;
mostSigBits |= Long.decode(components[2]).longValue();
long leastSigBits = Long.decode(components[3]).longValue();
leastSigBits <<= 48;
leastSigBits |= Long.decode(components[4]).longValue();
return new UUIDUtils(mostSigBits, leastSigBits);
}
// Field Accessor Methods
/**
* Returns the least significant 64 bits of this UUID's 128 bit value.
*
* @return The least significant 64 bits of this UUID's 128 bit value
*/
public long getLeastSignificantBits() {
return leastSigBits;
}
/**
* Returns the most significant 64 bits of this UUID's 128 bit value.
*
* @return The most significant 64 bits of this UUID's 128 bit value
*/
public long getMostSignificantBits() {
return mostSigBits;
}
/**
* The version number associated with this {@code UUID}. The version number
* describes how this {@code UUID} was generated.
* <p>
* The version number has the following meaning:
* <ul>
* <li>1 Time-based UUID
* <li>2 DCE security UUID
* <li>3 Name-based UUID
* <li>4 Randomly generated UUID
* </ul>
*
* @return The version number of this {@code UUID}
*/
public int version() {
// Version is bits masked by 0x000000000000F000 in MS long
return (int) ((mostSigBits >> 12) & 0x0f);
}
/**
* The variant number associated with this {@code UUID}. The variant number
* describes the layout of the {@code UUID}.
* <p>
* The variant number has the following meaning:
* <ul>
* <li>0 Reserved for NCS backward compatibility
* <li>2 <a
* href="http://www.ietf.org/rfc/rfc4122.txt">IETF&nbsp;RFC&nbsp;4122</a>
* (Leach-Salz), used by this class
* <li>6 Reserved, Microsoft Corporation backward compatibility
* <li>7 Reserved for future definition
* </ul>
*
* @return The variant number of this {@code UUID}
*/
public int variant() {
// This field is composed of a varying number of bits.
// 0 - - Reserved for NCS backward compatibility
// 1 0 - The IETF aka Leach-Salz variant (used by this class)
// 1 1 0 Reserved, Microsoft backward compatibility
// 1 1 1 Reserved for future definition.
return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63));
}
/**
* The timestamp value associated with this UUID.
*
* <p>
* The 60 bit timestamp value is constructed from the time_low, time_mid,
* and time_hi fields of this {@code UUID}. The resulting timestamp is
* measured in 100-nanosecond units since midnight, October 15, 1582 UTC.
*
* <p>
* The timestamp value is only meaningful in a time-based UUID, which has
* version type 1. If this {@code UUID} is not a time-based UUID then this
* method throws UnsupportedOperationException.
*
* @return The timestamp of this {@code UUID}.
* @throws UnsupportedOperationException If this UUID is not a version 1 UUID
*/
public long timestamp() {
if (version() != 1) {
throw new UnsupportedOperationException("Not a time-based UUID");
}
return (mostSigBits & 0x0FFFL) << 48
| ((mostSigBits >> 16) & 0x0FFFFL) << 32 | mostSigBits >>> 32;
}
/**
* The clock sequence value associated with this UUID.
*
* <p>
* The 14 bit clock sequence value is constructed from the clock sequence
* field of this UUID. The clock sequence field is used to guarantee
* temporal uniqueness in a time-based UUID.
*
* <p>
* The {@code clockSequence} value is only meaningful in a time-based UUID,
* which has version type 1. If this UUID is not a time-based UUID then this
* method throws UnsupportedOperationException.
*
* @return The clock sequence of this {@code UUID}
* @throws UnsupportedOperationException If this UUID is not a version 1 UUID
*/
public int clockSequence() {
if (version() != 1) {
throw new UnsupportedOperationException("Not a time-based UUID");
}
return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48);
}
/**
* The node value associated with this UUID.
*
* <p>
* The 48 bit node value is constructed from the node field of this UUID.
* This field is intended to hold the IEEE 802 address of the machine that
* generated this UUID to guarantee spatial uniqueness.
*
* <p>
* The node value is only meaningful in a time-based UUID, which has version
* type 1. If this UUID is not a time-based UUID then this method throws
* UnsupportedOperationException.
*
* @return The node value of this {@code UUID}
* @throws UnsupportedOperationException If this UUID is not a version 1 UUID
*/
public long node() {
if (version() != 1) {
throw new UnsupportedOperationException("Not a time-based UUID");
}
return leastSigBits & 0x0000FFFFFFFFFFFFL;
}
// Object Inherited Methods
/**
* Returns a {@code String} object representing this {@code UUID}.
*
* <p>
* The UUID string representation is as described by this BNF: <blockquote>
*
* <pre>
* {@code
* UUID = <time_low> "-" <time_mid> "-"
* <time_high_and_version> "-"
* <variant_and_sequence> "-"
* <node>
* time_low = 4*<hexOctet>
* time_mid = 2*<hexOctet>
* time_high_and_version = 2*<hexOctet>
* variant_and_sequence = 2*<hexOctet>
* node = 6*<hexOctet>
* hexOctet = <hexDigit><hexDigit>
* hexDigit =
* "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
* | "a" | "b" | "c" | "d" | "e" | "f"
* | "A" | "B" | "C" | "D" | "E" | "F"
* }
* </pre>
*
* </blockquote>
*
* @return A string representation of this {@code UUID}
*/
@Override
public String toString() {
return (digits(mostSigBits >> 32, 8) + digits(mostSigBits >> 16, 4)
+ digits(mostSigBits, 4) + digits(leastSigBits >> 48, 4) + digits(
leastSigBits, 12));
}
/** Returns val represented by the specified number of hex digits. */
private static String digits(long val, int digits) {
long hi = 1L << (digits * 4);
return Long.toHexString(hi | (val & (hi - 1))).substring(1);
}
/**
* Returns a hash code for this {@code UUID}.
*
* @return A hash code value for this {@code UUID}
*/
@Override
return (digits(mostSigBits >> 32, 8) + digits(mostSigBits >> 16, 4)
+ digits(mostSigBits, 4) + digits(leastSigBits >> 48, 4) + digits(
leastSigBits, 12));
}
/**
* Returns val represented by the specified number of hex digits.
*/
private static String digits(long val, int digits) {
long hi = 1L << (digits * 4);
return Long.toHexString(hi | (val & (hi - 1))).substring(1);
}
/**
* Returns a hash code for this {@code UUID}.
*
* @return A hash code value for this {@code UUID}
*/
@Override
public int hashCode() {
long hilo = mostSigBits ^ leastSigBits;
return ((int) (hilo >> 32)) ^ (int) hilo;
}
/**
* Compares this object to the specified object. The result is {@code true}
* if and only if the argument is not {@code null}, is a {@code UUID}
* object, has the same variant, and contains the same value, bit for bit,
* as this {@code UUID}.
*
* @param obj
* The object to be compared
*
* @return {@code true} if the objects are the same; {@code false} otherwise
*/
@Override
long hilo = mostSigBits ^ leastSigBits;
return ((int) (hilo >> 32)) ^ (int) hilo;
}
/**
* Compares this object to the specified object. The result is {@code true}
* if and only if the argument is not {@code null}, is a {@code UUID}
* object, has the same variant, and contains the same value, bit for bit,
* as this {@code UUID}.
*
* @param obj The object to be compared
* @return {@code true} if the objects are the same; {@code false} otherwise
*/
@Override
public boolean equals(Object obj) {
if ((null == obj) || (obj.getClass() != UUID.class)) {
if ((null == obj) || (obj.getClass() != UUID.class)) {
return false;
}
UUIDUtils id = (UUIDUtils) obj;
return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits);
}
// Comparison Operations
/**
* Compares this UUID with the specified UUID.
*
* <p>
* The first of two UUIDs is greater than the second if the most significant
* field in which the UUIDs differ is greater for the first UUID.
*
* @param val
* {@code UUID} to which this {@code UUID} is to be compared
*
* @return -1, 0 or 1 as this {@code UUID} is less than, equal to, or
* greater than {@code val}
*
*/
@Override
UUIDUtils id = (UUIDUtils) obj;
return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits);
}
// Comparison Operations
/**
* Compares this UUID with the specified UUID.
*
* <p>
* The first of two UUIDs is greater than the second if the most significant
* field in which the UUIDs differ is greater for the first UUID.
*
* @param val {@code UUID} to which this {@code UUID} is to be compared
* @return -1, 0 or 1 as this {@code UUID} is less than, equal to, or
* greater than {@code val}
*/
@Override
public int compareTo(UUIDUtils val) {
// The ordering is intentionally set up so that the UUIDs
// can simply be numerically compared as two numbers
return (this.mostSigBits < val.mostSigBits ? -1
: (this.mostSigBits > val.mostSigBits ? 1
: (this.leastSigBits < val.leastSigBits ? -1
: (this.leastSigBits > val.leastSigBits ? 1 : 0))));
}
// The ordering is intentionally set up so that the UUIDs
// can simply be numerically compared as two numbers
return (this.mostSigBits < val.mostSigBits ? -1
: (this.mostSigBits > val.mostSigBits ? 1
: (this.leastSigBits < val.leastSigBits ? -1
: (this.leastSigBits > val.leastSigBits ? 1 : 0))));
}
}
......@@ -5,7 +5,7 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -50,7 +50,7 @@ public class MybatisConfig {
/* 乐观锁插件 */
// configuration.addInterceptor(new OptimisticLockerInterceptor());
//非生产环境加载的插件
if (!CommonConstant.Env.PRO.equals(profile) ) {
if (!CommonConstant.Env.PRO.equals(profile)) {
configuration.addInterceptor(new PerformanceInterceptor());
}
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
package com.secoo.mall.openfeign.config;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
@Configuration
......
......@@ -6,7 +6,7 @@
<groupId>com.secoo.mall</groupId>
<artifactId>matrix</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
<packaging>pom</packaging>
......@@ -21,8 +21,9 @@
<module>web-starter</module>
<module>openfeign-starter</module>
<module>rocketmq-starter</module>
<module>config-starter</module>
<module>monitor-starter</module>
<module>config-starter</module>
<module>logger-starter</module>
</modules>
<parent>
......@@ -98,62 +99,67 @@
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>monitor-starter</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>common-core</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>config-starter</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>common-util</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>redis-starter</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>mybatis-starter</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>mongodb-starter</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>elasticsearch-starter</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>dubbo-starter</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>web-starter</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>rocketmq-starter</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>openfeign-starter</artifactId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>logger-starter</artifactId>
<version>1.0.5.RELEASE</version>
</dependency>
<dependency>
......@@ -243,6 +249,12 @@
</exclusion>
</exclusions>
</dependency>
<!--rocketmq-->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......@@ -20,5 +20,9 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -5,11 +5,16 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>rocketmq-starter</artifactId>
<dependencies>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -5,7 +5,7 @@
<parent>
<artifactId>matrix</artifactId>
<groupId>com.secoo.mall</groupId>
<version>1.0.4.RELEASE</version>
<version>1.0.5.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -3,12 +3,12 @@ package com.secoo.mall.web.advice;
import com.secoo.mall.common.core.errorcode.CommonErrorCode;
import com.secoo.mall.common.core.exception.BusinessException;
import com.secoo.mall.common.core.exception.ParameterException;
import com.secoo.mall.common.core.exception.SystemInternalException;
import com.secoo.mall.common.util.log.LoggerUtil;
import com.secoo.mall.common.util.response.ResponseUtil;
import com.secoo.mall.web.annotation.ApiController;
import com.secoo.mall.web.annotation.ApiIgnoreJson;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContext;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotationUtils;
......@@ -21,7 +21,6 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import javax.annotation.Resource;
import java.util.Locale;
@RestControllerAdvice(annotations = ApiController.class)
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object> {
......@@ -41,7 +40,7 @@ public class ControllerResponseAdvice implements ResponseBodyAdvice<Object> {
return ResponseUtil.getFailResponse(e.getCode(), msg);
}
@ExceptionHandler(Exception.class)
@ExceptionHandler({SystemInternalException.class, Exception.class})
public Object exceptionHandler(Exception e) {
LoggerUtil.error(e);
return ResponseUtil.getFailResponse(CommonErrorCode.SYSTEM_INTERNAL_EXCEPTION.getCode(), CommonErrorCode.SYSTEM_INTERNAL_EXCEPTION.getMsg());
......@@ -54,7 +53,7 @@ public class ControllerResponseAdvice implements ResponseBodyAdvice<Object> {
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
return ResponseUtil.getSuccessResponse(o);
return ResponseUtil.getSuccessResponse(o);
}
private String getMsg(BusinessException e) {
......
package com.secoo.mall.web.config;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.secoo.mall.web.resolver.DefaultLocaleResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
......@@ -11,7 +9,6 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import java.text.SimpleDateFormat;
import java.util.Locale;
/**
......
......@@ -4,7 +4,6 @@ import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrap
import com.secoo.mall.common.core.condition.ProdEnvCondition;
import com.secoo.mall.web.annotation.ApiController;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
......@@ -29,12 +28,12 @@ public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.groupName("SecooMall")
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(ApiController.class))
.paths( PathSelectors.any())
.paths(PathSelectors.any())
.build();
}
......
......@@ -15,7 +15,7 @@ import java.util.List;
@Configuration
public class WebConfig {
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
......
......@@ -14,8 +14,10 @@ public class DefaultLocaleResolver extends CookieLocaleResolver {
@Nullable
protected Locale determineDefaultLocale(HttpServletRequest request) {
if (!StringUtil.isEmpty(request.getHeader("Accept-Language"))) {
return Locale.forLanguageTag(request.getHeader("Accept-Language"));
Locale locale = Locale.forLanguageTag(request.getHeader("Accept-Language"));
return "zh".equalsIgnoreCase(locale.toLanguageTag()) ? super.determineDefaultLocale(request) : locale;
}
String lang = request.getParameter("lang");
......
......@@ -39,8 +39,8 @@ public class WebUtil {
return (ServletRequestAttributes) attributes;
}
public static <T> void setAttribute(String name,T obj) {
getRequest().setAttribute(name,obj);
public static <T> void setAttribute(String name, T obj) {
getRequest().setAttribute(name, obj);
}
}
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