From c144f66df5c3a137ac9ce398287081c4cdb879bf Mon Sep 17 00:00:00 2001 From: tianliyong Date: Thu, 3 Nov 2022 18:17:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Efeign-starter=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- axzo-common-clients/feign-starter/pom.xml | 65 +++++++ .../FeignFallback.java | 64 +++++++ .../decoder/ApiResultErrorDecoder.java | 64 +++++++ .../logger/ClientDecorator.java | 29 +++ .../logger/FeignLogger.java | 179 ++++++++++++++++++ .../logger/RequestIOException.java | 24 +++ axzo-common-clients/pom.xml | 1 + .../axzo/framework/domain/page/PageResp.java | 13 +- .../domain/web/result/ApiPageResult.java | 4 + .../domain/web/result/ApiPageResult1.java | 161 ---------------- .../deser/BigFractionDeserializer.java | 2 +- .../fraction/deser/FractionDeserializer.java | 2 +- .../fraction/ser/BigFractionSerializer.java | 2 +- .../fraction/ser/FractionSerializer.java | 2 +- .../jackson/datatype/string/TrimModule.java | 2 +- .../string/deser/TrimDeserializer.java | 2 +- .../deser/TrimDeserializerModifier.java | 2 +- .../datatype/string/ser/TrimSerializer.java | 2 +- pom.xml | 5 + 19 files changed, 453 insertions(+), 172 deletions(-) create mode 100644 axzo-common-clients/feign-starter/pom.xml create mode 100644 axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/FeignFallback.java create mode 100644 axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/decoder/ApiResultErrorDecoder.java create mode 100644 axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/ClientDecorator.java create mode 100644 axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/FeignLogger.java create mode 100644 axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/RequestIOException.java delete mode 100644 axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiPageResult1.java diff --git a/axzo-common-clients/feign-starter/pom.xml b/axzo-common-clients/feign-starter/pom.xml new file mode 100644 index 0000000..8062c81 --- /dev/null +++ b/axzo-common-clients/feign-starter/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + + axzo-common-clients + cn.axzo.framework.client + 1.0.0-SNAPSHOT + + + feign-starter + Axzo Common Client Feign Starter + + + + + cn.axzo.framework + axzo-common-domain + + + cn.axzo.framework.jackson + jackson-starter + + + io.github.openfeign + feign-core + + + io.github.openfeign + feign-slf4j + + + io.github.openfeign + feign-hystrix + + + io.github.openfeign + feign-okhttp + + + com.squareup.okhttp3 + okhttp + + + + + com.squareup.okhttp3 + okhttp + + + io.github.openfeign.form + feign-form + + + + + io.github.openfeign.form + feign-form-spring + true + + + + \ No newline at end of file diff --git a/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/FeignFallback.java b/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/FeignFallback.java new file mode 100644 index 0000000..28ea106 --- /dev/null +++ b/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/FeignFallback.java @@ -0,0 +1,64 @@ +package cn.axzo.framework.client.feign; + +import cn.axzo.framework.domain.web.ApiException; +import cn.axzo.framework.domain.web.code.IRespCode; +import cn.axzo.framework.domain.web.result.ApiListResult; +import cn.axzo.framework.domain.web.result.ApiPageResult; +import cn.axzo.framework.domain.web.result.ApiResult; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.Nullable; + +/** + * @author liyong.tian + * @since 2022/11/3 + */ +@RequiredArgsConstructor +@Getter +@Slf4j +public class FeignFallback { + + @Nullable + private final Throwable cause; + + private final IRespCode respCode; + + public ApiResult resp() { + if (cause != null) { + log.error("Enter feign fallback", cause); + if (cause instanceof ApiException) { + return ApiResult.err(((ApiException) cause).getCode(), cause.getMessage()); + } + return ApiResult.err(respCode, cause.getMessage()); + } + log.error("Enter feign fallback,no cause catch"); + return ApiResult.err(respCode); + } + + public ApiPageResult pageResp() { + if (cause != null) { + log.error("Enter feign fallback", cause); + if (cause instanceof ApiException) { + return ApiPageResult.err(((ApiException) cause).getCode(), cause.getMessage()); + } + return ApiPageResult.err(respCode, cause.getMessage()); + } + log.error("Enter feign fallback,no cause catch"); + + return ApiPageResult.err(respCode); + } + + public ApiListResult listResp() { + if (cause != null) { + log.error("Enter feign fallback", cause); + if (cause instanceof ApiException) { + return ApiListResult.err(((ApiException) cause).getCode(), cause.getMessage()); + } + return ApiListResult.err(respCode, cause.getMessage()); + } + log.error("Enter feign fallback,no cause catch"); + return ApiListResult.err(respCode); + } +} diff --git a/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/decoder/ApiResultErrorDecoder.java b/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/decoder/ApiResultErrorDecoder.java new file mode 100644 index 0000000..7cf339a --- /dev/null +++ b/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/decoder/ApiResultErrorDecoder.java @@ -0,0 +1,64 @@ +package cn.axzo.framework.client.feign.decoder; + +import cn.axzo.framework.core.util.ClassUtil; +import cn.axzo.framework.domain.ServiceException; +import cn.axzo.framework.domain.web.ApiException; +import cn.axzo.framework.domain.web.ClientException; +import cn.axzo.framework.domain.web.code.IRespCode; +import cn.axzo.framework.domain.web.code.RespCode; +import cn.axzo.framework.domain.web.http.HttpStatus; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.framework.jackson.utility.JSON; +import feign.Response; +import feign.codec.ErrorDecoder; +import lombok.extern.slf4j.Slf4j; + +import static cn.axzo.framework.core.Constants.CLIENT_MARKER; +import static cn.axzo.framework.domain.web.code.BaseCode.NOT_FOUND; +import static java.lang.String.format; + +/** + * @author liyong.tian + * @since 2022/11/3 + */ +@Slf4j +public class ApiResultErrorDecoder implements ErrorDecoder { + + private static final boolean isHystrixPresent; + + static { + isHystrixPresent = ClassUtil.isPresent( + "com.netflix.hystrix.exception.HystrixBadRequestException", + ApiResultErrorDecoder.class.getClassLoader() + ); + } + + public ApiResultErrorDecoder() { + log.info(format("Add Feign ErrorDecoder: %s, isHystrixPresent: %s", "ApiResultErrorDecoder", isHystrixPresent)); + } + + @Override + public Exception decode(String methodKey, Response response) { + try { + HttpStatus status = HttpStatus.valueOf(response.status()); + if (status == HttpStatus.NOT_FOUND) { + return new ApiException("url[" + response.request().url() + "] not found", NOT_FOUND); + } + + ApiResult apiResult = JSON.parseObject(response.body().asInputStream(), ApiResult.class); + String code = apiResult.getCode(); + if (code == null) { + return new ServiceException("ApiResult code is null"); + } + + IRespCode respCode = new RespCode(code, apiResult.getMsg()); + if (isHystrixPresent && status.is4xxClientError()) { + return new ClientException(respCode); // 不熔断 + } + return new ApiException(respCode); + } catch (Exception e) { + log.error(CLIENT_MARKER, format("%s reading %s ", e.getMessage(), methodKey), e); + return e; + } + } +} diff --git a/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/ClientDecorator.java b/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/ClientDecorator.java new file mode 100644 index 0000000..2e84488 --- /dev/null +++ b/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/ClientDecorator.java @@ -0,0 +1,29 @@ +package cn.axzo.framework.client.feign.logger; + +import feign.Client; +import feign.Request; +import feign.Response; + +import java.io.IOException; + +/** + * @author liyong.tian + * @since 2022/11/3 + */ +public class ClientDecorator implements Client { + + private final Client delegate; + + public ClientDecorator(Client delegate) { + this.delegate = delegate; + } + + @Override + public Response execute(Request request, Request.Options options) throws RequestIOException { + try { + return delegate.execute(request, options); + } catch (IOException e) { + throw new RequestIOException(request, e); + } + } +} diff --git a/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/FeignLogger.java b/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/FeignLogger.java new file mode 100644 index 0000000..c3b70d1 --- /dev/null +++ b/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/FeignLogger.java @@ -0,0 +1,179 @@ +package cn.axzo.framework.client.feign.logger; + +import com.google.common.base.Joiner; +import cn.axzo.framework.domain.http.*; +import cn.axzo.framework.domain.web.http.HttpStatus; +import feign.Request; +import feign.Response; +import feign.Util; +import feign.slf4j.Slf4jLogger; +import lombok.val; +import org.javatuples.Pair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.List; +import java.util.Objects; + +import static cn.axzo.framework.core.Constants.CLIENT_MARKER; +import static java.nio.charset.Charset.defaultCharset; +import static java.util.stream.Collectors.toList; +import static jodd.util.StringPool.*; + +/** + * @author liyong.tian + * @since 2022/11/2 + */ +@SuppressWarnings("WeakerAccess") +public class FeignLogger extends Slf4jLogger { + + private final Logger log; + + private final HttpLogFormatter formatter; + + public FeignLogger(Class clazz) { + this(clazz, JsonHttpLogFormatter.INSTANCE); + } + + public FeignLogger(Class clazz, HttpLogFormatter formatter) { + super(clazz); + this.log = LoggerFactory.getLogger(clazz); + if (formatter == null) { + this.formatter = JsonHttpLogFormatter.INSTANCE; + } else { + this.formatter = formatter; + } + } + + @Override + protected void log(String configKey, String format, Object... args) { + IllegalStateException exception = new IllegalStateException("this method may not be invoked"); + log.error("will not happen", exception); + throw exception; + } + + @Override + protected void logRequest(String configKey, Level logLevel, Request request) { + // do nothing + } + + @Override + protected IOException logIOException(String configKey, Level logLevel, IOException ioe, long elapsedTime) { + if (logLevel == Level.NONE || !(ioe instanceof RequestIOException)) { + //响应日志 + HttpResponseLog responseLog = _responseLog(configKey, ioe, elapsedTime); + + //打印响应日志 + log.error(CLIENT_MARKER, formatter.format(responseLog), ioe); + return ioe; + } + + Request request = ((RequestIOException) ioe).getRequest(); + + //请求日志 + HttpRequestLog requestLog = _requestLog(request); + + //响应日志 + HttpResponseLog responseLog = _responseLog(request.url(), ioe, elapsedTime); + + //打印完整的请求响应日志 + log.error(CLIENT_MARKER, formatter.format(requestLog, responseLog), ioe); + return ioe; + } + + @Override + protected void logRetry(String configKey, Level logLevel) { + log.info(CLIENT_MARKER, methodTag(configKey) + "---> RETRYING"); + } + + @Override + protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime) + throws IOException { + if (logLevel == Level.NONE) { + return response; + } + + //请求日志 + val requestLog = _requestLog(response.request()); + + //响应日志 + val responsePair = _responseLog(response, elapsedTime); + + //打印完整的请求响应日志 + log.info(CLIENT_MARKER, formatter.format(requestLog, responsePair.getValue0())); + return responsePair.getValue1(); + } + + private HttpRequestLog _requestLog(Request request) { + Objects.requireNonNull(request, "request cannot be null"); + + val logBuilder = HttpRequestLog.builder(); + + //protocol + logBuilder.protocol("HTTP/1.1"); + + //method + logBuilder.method(request.method()); + + //url + logBuilder.url(request.url()); + + //headers + List requestHeaders = request.headers().entrySet().stream() + .map(entry -> entry.getKey() + COLON + SPACE + Joiner.on(COMMA + SPACE).join(entry.getValue())) + .collect(toList()); + logBuilder.headers(requestHeaders); + + //body + if (!HttpHeaderUtil.isMultipartRequest(requestHeaders)) { + logBuilder.body(request.body() == null ? null : new String(request.body())); + } + + return logBuilder.build(); + } + + private Pair _responseLog(Response response, long elapsedTime) throws IOException { + val logBuilder = HttpResponseLog.builder(); + + HttpStatus status = HttpStatus.valueOf(response.status()); + List responseHeaders = response.headers().entrySet().stream() + .map(entry -> entry.getKey() + COLON + SPACE + Joiner.on(COMMA + SPACE).join(entry.getValue())) + .collect(toList()); + //url + logBuilder.url(response.request().url()); + + //status + logBuilder.status(status.value()); + + //msg + logBuilder.msg(status.getReasonPhrase()); + + //headers + logBuilder.headers(responseHeaders); + + //tookMs + logBuilder.tookMs(elapsedTime); + + //body + boolean canReadBody = response.body() != null && !HttpHeaderUtil.isDownloadResponse(responseHeaders); + if (canReadBody) { + byte[] bodyBytes = Util.toByteArray(response.body().asInputStream()); + logBuilder.body(new String(bodyBytes, defaultCharset())); + //流只能读一次,需要把响应重新构造一次 + response = response.toBuilder().body(bodyBytes).build(); + } else { + logBuilder.body(EMPTY); + } + + return Pair.with(logBuilder.build(), response); + } + + private HttpResponseLog _responseLog(String url, IOException ioe, long elapsedTime) { + return HttpResponseLog.builder() + .url(url) + .tookMs(elapsedTime) + .errorMsg(ioe.getClass().getSimpleName() + ": " + ioe.getMessage()) + .build(); + } +} diff --git a/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/RequestIOException.java b/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/RequestIOException.java new file mode 100644 index 0000000..38e96a6 --- /dev/null +++ b/axzo-common-clients/feign-starter/src/main/java/cn.axzo.framework.client.feign/logger/RequestIOException.java @@ -0,0 +1,24 @@ +package cn.axzo.framework.client.feign.logger; + +import feign.Request; +import lombok.Getter; + +import java.io.IOException; + +/** + * @author liyong.tian + * @since 2022/11/2 + */ +public class RequestIOException extends IOException { + + @Getter + private final Request request; + + private final IOException exception; + + public RequestIOException(Request request, IOException cause) { + super(cause instanceof RequestIOException ? ((RequestIOException) cause).exception : cause); + this.request = request; + this.exception = cause; + } +} diff --git a/axzo-common-clients/pom.xml b/axzo-common-clients/pom.xml index be6b81a..4ee445d 100644 --- a/axzo-common-clients/pom.xml +++ b/axzo-common-clients/pom.xml @@ -17,5 +17,6 @@ retrofit-starter + feign-starter \ No newline at end of file diff --git a/axzo-common-domain/src/main/java/cn/axzo/framework/domain/page/PageResp.java b/axzo-common-domain/src/main/java/cn/axzo/framework/domain/page/PageResp.java index 1c07250..9ebfe75 100644 --- a/axzo-common-domain/src/main/java/cn/axzo/framework/domain/page/PageResp.java +++ b/axzo-common-domain/src/main/java/cn/axzo/framework/domain/page/PageResp.java @@ -43,11 +43,11 @@ public class PageResp { return new PageResp(pageNum, pageSize, 0L, new ArrayList<>()); } - public static PageResp list(Long page, Long pageSize, Long totalCount, List data) { + public static PageResp list(Long pageNum, Long pageSize, Long totalCount, List data) { if (CollectionUtils.isEmpty(data)) { - return zero(page, pageSize); + return zero(pageNum, pageSize); } - return new PageResp(page, pageSize, totalCount, data); + return new PageResp(pageNum, pageSize, totalCount, data); } public static PageResp list(IPage page, List data) { @@ -57,4 +57,11 @@ public class PageResp { return new PageResp(page.getCurrent(), page.getSize(), page.getTotal(), data); } + public static PageResp list(PageQO page, Long totalCount, List data) { + if (CollectionUtils.isEmpty(data)) { + return zero(page.getPage(), page.getPageSize()); + } + return new PageResp(page.getPage(), page.getPageSize(), totalCount, data); + + } } \ No newline at end of file diff --git a/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiPageResult.java b/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiPageResult.java index 7e7633f..c2ef174 100644 --- a/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiPageResult.java +++ b/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiPageResult.java @@ -139,4 +139,8 @@ public class ApiPageResult extends ApiCoreResult>{ public Page toPage(Pageable pageable) { return new PageImpl<>(data == null ? Lists.newArrayList() : data.getList(), pageable, data.getTotalCount()); } + + public PageResp toPage() { + return new PageResp(data.getPageNum().longValue(), data.getPageSize().longValue(), data.getTotalCount(), data.getList() == null ? Lists.newArrayList() : data.getList()); + } } diff --git a/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiPageResult1.java b/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiPageResult1.java deleted file mode 100644 index 9c0cdab..0000000 --- a/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiPageResult1.java +++ /dev/null @@ -1,161 +0,0 @@ -package cn.axzo.framework.domain.web.result; - -import static cn.axzo.framework.domain.web.code.BaseCode.SUCCESS; -import static com.google.common.collect.Lists.newArrayList; - -import cn.axzo.framework.domain.page.Page; -import cn.axzo.framework.domain.page.PageImpl; -import cn.axzo.framework.domain.page.PageResp; -import cn.axzo.framework.domain.page.PageVerbose; -import cn.axzo.framework.domain.page.Pageable; -import cn.axzo.framework.domain.web.code.IRespCode; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.github.pagehelper.PageInfo; -import com.google.common.collect.Lists; -import io.swagger.annotations.ApiModelProperty; -import java.beans.ConstructorProperties; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -/** - * @Description - * @Author liyong.tian - * @Date 2020/9/7 20:32 - **/ -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@JsonPropertyOrder({"total", "code", "msg", "data", "pageNum", "pageSize", "verbose"}) -public class ApiPageResult1 extends ApiCoreResult> { - - @ApiModelProperty(value = "总记录数", position = 101, required = true) - private final Long total; - - @ApiModelProperty(value = "当前页", position = 102) - private final Integer pageNum; - - @ApiModelProperty(value = "每页显示数量", position = 103) - private final Integer pageSize; - - @ApiModelProperty(value = "分页冗余信息", position = 104) - private final PageVerbose verbose; - - public static ApiPageResult1 empty() { - return ok(newArrayList(), 0L); - } - - public static ApiPageResult1 ok(Page page) { - Pageable current = page.current(); - - // data - List data = page.getContent(); - if (!current.needContent() && data.isEmpty()) { - data = null; - } - - // pageNum & pageSize - Integer pageNum = null; - Integer pageSize = null; - if (current.isFixEdge() && current.needContent()) { - pageNum = current.getPageNumber(); - pageSize = current.getPageSize(); - } - - // verbose - PageVerbose verbose = PageVerbose.of(page).orElse(null); - return ok(data, page.getTotal(), pageNum, pageSize, verbose); - } - - public static ApiPageResult1 ok(PageInfo pageInfo) { - return ok(pageInfo.getList(), pageInfo.getTotal(), pageInfo.getPageNum(), pageInfo.getPageSize()); - } - - public static ApiPageResult1 ok(org.springframework.data.domain.Page page) { - return ok(page.getContent(), page.getTotalElements()); - } - - public static ApiPageResult1 ok(IPage page) { - return ok(page.getRecords(), page.getTotal(), (int)page.getCurrent(), (int)page.getSize()); - } - - public static ApiPageResult1 ok(PageResp page) { - return ok(page.getList(), page.getTotalCount(), page.getPage().intValue(), page.getPageSize().intValue()); - } - - public static ApiPageResult1 ok(List data, Long total) { - return build(total, SUCCESS.getRespCode(), SUCCESS.getMessage(), data, - null, null, null); - } - - public static ApiPageResult1 ok(List data, Long total, Integer pageNumber, Integer pageSize) { - return build(total, SUCCESS.getRespCode(), SUCCESS.getMessage(), data, pageNumber, pageSize, null); - } - - public static ApiPageResult1 ok(List data, Long total, Integer pageNumber, Integer pageSize, - PageVerbose verbose) { - return build(total, SUCCESS.getRespCode(), SUCCESS.getMessage(), data, pageNumber, pageSize, verbose); - } - - public static ApiPageResult1 err(IRespCode code) { - return build(code); - } - - public static ApiPageResult1 err(IRespCode code, String message) { - return err(code.getRespCode(), message); - } - - public static ApiPageResult1 err(String code, String message) { - return build(null, code, message, null, null, null, null); - } - - public static ApiPageResult1 build(IRespCode code) { - return build(null, code, null, null, null); - } - - public static ApiPageResult1 build(Long total, IRespCode code, List data, - Integer pageNum, Integer pageSize) { - return build(total, code.getRespCode(), code.getMessage(), data, pageNum, pageSize, null); - } - - public static ApiPageResult1 build(Long total, String code, String message, List data, - Integer pageNum, Integer pageSize) { - return new ApiPageResult1<>(total, code, message, data, pageNum, pageSize, null); - } - - public static ApiPageResult1 build(Long total, String code, String message, List data, - Integer pageNum, Integer pageSize, PageVerbose verbose) { - return new ApiPageResult1<>(total, code, message, data, pageNum, pageSize, verbose); - } - - @ConstructorProperties({"total", "code", "message", "data", "pageNum", "pageSize", "verbose"}) - public ApiPageResult1(Long total, String code, String message, List data, Integer pageNum, Integer pageSize, - PageVerbose verbose) { - super(code, message, data); - this.total = total; - this.pageNum = pageNum; - this.pageSize = pageSize; - this.verbose = verbose; - } - - @Override - public Map toMap() { - Map map = new LinkedHashMap<>(); - map.put("code", code); - map.put("msg", msg); - map.put("total", total); - map.put("data", data); - map.put("pageNum", pageNum); - map.put("pageSize", pageSize); - map.put("verbose", verbose); - return map; - } - - public Page toPage(Pageable pageable) { - return new PageImpl<>(data == null ? Lists.newArrayList() : data, pageable, total); - } -} diff --git a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/deser/BigFractionDeserializer.java b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/deser/BigFractionDeserializer.java index 409c616..dd2126b 100644 --- a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/deser/BigFractionDeserializer.java +++ b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/deser/BigFractionDeserializer.java @@ -20,7 +20,7 @@ import static jodd.util.StringPool.COMMA; * 1/100 * [1,100] * - * @author jearton + * @author liyong.tian * @since 2017/3/3 */ public class BigFractionDeserializer extends JsonDeserializer { diff --git a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/deser/FractionDeserializer.java b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/deser/FractionDeserializer.java index f2c3c90..42bf3ac 100644 --- a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/deser/FractionDeserializer.java +++ b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/deser/FractionDeserializer.java @@ -20,7 +20,7 @@ import static jodd.util.StringPool.COMMA; * 1/100 * [1,100] * - * @author jearton + * @author liyong.tian * @since 2017/3/2 */ public class FractionDeserializer extends JsonDeserializer { diff --git a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/ser/BigFractionSerializer.java b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/ser/BigFractionSerializer.java index 7ad1e13..a68b1b9 100644 --- a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/ser/BigFractionSerializer.java +++ b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/ser/BigFractionSerializer.java @@ -14,7 +14,7 @@ import java.io.IOException; * 1/100 * [1,100] * - * @author jearton + * @author liyong.tian * @since 2017/3/2 */ public class BigFractionSerializer extends JsonSerializer { diff --git a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/ser/FractionSerializer.java b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/ser/FractionSerializer.java index 175772d..9b2b9ae 100644 --- a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/ser/FractionSerializer.java +++ b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/ser/FractionSerializer.java @@ -14,7 +14,7 @@ import java.io.IOException; * 1/100 * [1,100] * - * @author jearton + * @author liyong.tian * @since 2017/3/2 */ public class FractionSerializer extends JsonSerializer { diff --git a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/TrimModule.java b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/TrimModule.java index eccd074..c533f11 100644 --- a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/TrimModule.java +++ b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/TrimModule.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import static cn.axzo.framework.jackson.datatype.string.PackageVersion.VERSION; /** - * @author jearton + * @author liyong.tian * @since 2017/1/6 */ public class TrimModule extends SimpleModule { diff --git a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/deser/TrimDeserializer.java b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/deser/TrimDeserializer.java index d70dfe0..a14ef4b 100644 --- a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/deser/TrimDeserializer.java +++ b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/deser/TrimDeserializer.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.databind.deser.std.StringDeserializer; import java.io.IOException; /** - * @author jearton + * @author liyong.tian * @since 2017/1/6 */ public class TrimDeserializer extends StdScalarDeserializer { diff --git a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/deser/TrimDeserializerModifier.java b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/deser/TrimDeserializerModifier.java index 89a5b1a..0021139 100644 --- a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/deser/TrimDeserializerModifier.java +++ b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/deser/TrimDeserializerModifier.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; import com.fasterxml.jackson.databind.deser.std.StringDeserializer; /** - * @author jearton + * @author liyong.tian * @since 2017/1/6 */ public class TrimDeserializerModifier extends BeanDeserializerModifier { diff --git a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/ser/TrimSerializer.java b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/ser/TrimSerializer.java index 1e3bf33..7f4d871 100644 --- a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/ser/TrimSerializer.java +++ b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/ser/TrimSerializer.java @@ -12,7 +12,7 @@ import java.io.IOException; import java.lang.reflect.Type; /** - * @author jearton + * @author liyong.tian * @since 2017/1/6 */ public class TrimSerializer extends StdScalarSerializer { diff --git a/pom.xml b/pom.xml index 289f714..d804123 100644 --- a/pom.xml +++ b/pom.xml @@ -123,6 +123,11 @@ retrofit-starter ${axzo-commons.version} + + cn.axzo.framework.client + feign-starter + ${axzo-commons.version} +