精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Boot 接口響應封裝與國際化、多租戶拓展實戰

開發 前端
?在企業級應用中,構建一個統一、標準、可擴展的接口返回結構,對于前后端協作、異常處理、國際化、多租戶支持等都有重要意義。

在企業級應用中,構建一個統一、標準、可擴展的接口返回結構,對于前后端協作、異常處理、國際化、多租戶支持等都有重要意義。本文基于 Spring Boot 框架,提供一套完整的接口封裝方案,并進一步集成:

  • 通用返回值結構 Result<T>
  • 分頁數據結構 PageResult<T>
  • 國際化消息支持(i18n)
  • 多語言錯誤碼體系
  • 多租戶 traceId 注入機制
  • 全局異常統一處理
  • 自動封裝響應體
  • Swagger 文檔兼容

項目結構總覽

src/
└── main/
    ├── java/
    │   └── com/icoderoad/
    │       ├── common/
    │       │   ├── model/            # Result、PageResult、ErrorCode
    │       │   ├── handler/          # ResponseBodyAdvice & ExceptionHandler
    │       │   ├── i18n/             # 國際化消息工具
    │       │   └── trace/            # traceId / tenantId 線程上下文
    │       └── user/controller/      # 示例業務接口
    └── resources/
        ├── messages.properties
        ├── messages_en.properties
        └── application.yml

統一返回結構:Result

/common/model/Result.java

package com.icoderoad.common.model;


public class Result<T> {
    private int code;
    private String msg;
    private T data;
    private String traceId;


    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(ErrorCode.SUCCESS.getCode());
        result.setMsg(ErrorCode.SUCCESS.getMessage());
        result.setData(data);
        result.setTraceId(TraceContextHolder.getTraceId());
        return result;
    }


    public static <T> Result<T> failed(ErrorCode errorCode) {
        Result<T> result = new Result<>();
        result.setCode(errorCode.getCode());
        result.setMsg(errorCode.getMessage());
        result.setTraceId(TraceContextHolder.getTraceId());
        return result;
    }


    public Result<T> withMsg(String msg) {
        this.msg = msg;
        return this;
    }


    public Result<T> withCode(int code) {
        this.code = code;
        return this;
    }


    public Result<T> withTraceId(String traceId) {
        this.traceId = traceId;
        return this;
    }


    // Getter & Setter 省略
}

分頁響應結構:PageResult

/common/model/PageResult.java

package com.icoderoad.common.model;


import java.util.List;


public class PageResult<T> {
    private long pageNum;
    private long pageSize;
    private long total;
    private long totalPage;
    private List<T> list;


    public PageResult(long pageNum, long pageSize, long total, List<T> list) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;
        this.list = list;
        this.totalPage = (long) Math.ceil((double) total / pageSize);
    }


    // Getter & Setter 省略
}

統一錯誤碼定義:ErrorCode 枚舉

/common/model/ErrorCode.java

package com.icoderoad.common.model;


import com.icoderoad.common.i18n.MessageUtils;


public enum ErrorCode {
    SUCCESS(200, "success"),
    FAILED(500, "failed"),
    UNAUTHORIZED(401, "unauthorized"),
    USER_NOT_FOUND(40001, "user.not.found"),
    SYSTEM_ERROR(50001, "system.error");


    private final int code;
    private final String i18nKey;


    ErrorCode(int code, String i18nKey) {
        this.code = code;
        this.i18nKey = i18nKey;
    }


    public int getCode() {
        return code;
    }


    public String getMessage() {
        return MessageUtils.get(i18nKey);
    }
}

國際化支持:MessageUtils 工具類

/common/i18n/MessageUtils.java

package com.icoderoad.common.i18n;


import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;


import java.util.Locale;


@Component
public class MessageUtils {


    private static MessageSource messageSource;


    @Autowired
    public MessageUtils(MessageSource messageSource) {
        MessageUtils.messageSource = messageSource;
    }


    public static String get(String key, Object... args) {
        Locale locale = LocaleContextHolder.getLocale();
        return messageSource.getMessage(key, args, locale);
    }
}

/resources/messages.properties

success=成功
failed=失敗
unauthorized=未授權
user.not.found=用戶不存在
system.error=系統異常

/common/trace/TraceContextHolder.java

package com.icoderoad.common.trace;


public class TraceContextHolder {
    private static final ThreadLocal<String> TRACE_ID = new ThreadLocal<>();
    private static final ThreadLocal<String> TENANT_ID = new ThreadLocal<>();


    public static void setTraceId(String traceId) {
        TRACE_ID.set(traceId);
    }


    public static String getTraceId() {
        return TRACE_ID.get();
    }


    public static void setTenantId(String tenantId) {
        TENANT_ID.set(tenantId);
    }


    public static String getTenantId() {
        return TENANT_ID.get();
    }


    public static void clear() {
        TRACE_ID.remove();
        TENANT_ID.remove();
    }
}

/common/trace/TraceInterceptor.java

package com.icoderoad.common.trace;


import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;


@Component
public class TraceInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String traceId = UUID.randomUUID().toString().replaceAll("-", "");
        String tenantId = request.getHeader("X-Tenant-ID");
        TraceContextHolder.setTraceId(traceId);
        TraceContextHolder.setTenantId(tenantId != null ? tenantId : "default");
        return true;
    }


    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        TraceContextHolder.clear();
    }
}

自動封裝返回值:ResponseBodyAdvice

/common/handler/GlobalResponseHandler.java

package com.icoderoad.common.handler;


import com.alibaba.fastjson.JSON;
import com.icoderoad.common.model.Result;
import com.icoderoad.common.trace.TraceContextHolder;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;


@RestControllerAdvice
public class GlobalResponseHandler implements ResponseBodyAdvice<Object> {


    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return !Result.class.isAssignableFrom(returnType.getParameterType());
    }


    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        if (body instanceof String) {
            return JSON.toJSONString(Result.success(body));
        }
        return Result.success(body);
    }
}

統一異常處理

/common/handler/GlobalExceptionHandler.java

package com.icoderoad.common.handler;


import com.icoderoad.common.model.ErrorCode;
import com.icoderoad.common.model.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


@RestControllerAdvice
public class GlobalExceptionHandler {


    @ExceptionHandler(Exception.class)
    public Result<String> handle(Exception e) {
        if (e instanceof BusinessException) {
            return Result.failed(ErrorCode.USER_NOT_FOUND).withMsg(e.getMessage());
        } else if (e instanceof UnauthorizedException) {
            return Result.failed(ErrorCode.UNAUTHORIZED);
        }
        return Result.failed(ErrorCode.SYSTEM_ERROR);
    }
}

Swagger 集成通用返回類型

/common/config/SwaggerConfig.java

package com.icoderoad.common.config;


import com.icoderoad.common.model.Result;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;


@Configuration
public class SwaggerConfig {
    @Bean
    public Docket createApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .genericModelSubstitutes(Result.class)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.icoderoad"))
                .paths(PathSelectors.any())
                .build();
    }
}

使用示例:分頁用戶查詢

@GetMapping("/users")
public Result<PageResult<User>> getUsers(@RequestParam int pageNum, @RequestParam int pageSize) {
    PageInfo<User> pageInfo = userService.getUsers(pageNum, pageSize);
    PageResult<User> pageResult = new PageResult<>(
        pageInfo.getPageNum(), pageInfo.getPageSize(), pageInfo.getTotal(), pageInfo.getList());
    return Result.success(pageResult);
}

總結

特性

實現方案

通用響應結構

Result / PageResult

異常統一封裝

GlobalExceptionHandler

自動響應包裝

ResponseBodyAdvice

國際化支持

MessageSource + messages.properties

錯誤碼多語言

ErrorCode + i18nKey

traceId + 多租戶

攔截器 + ThreadLocal

API文檔兼容

Swagger genericModelSubstitutes


責任編輯:武曉燕 來源: 路條編程
相關推薦

2022-07-27 10:39:14

Spring代碼IDEA

2025-11-04 07:58:20

SpringBoot多語言18n

2011-08-29 09:48:30

springMVC

2024-01-04 08:16:34

Spring國際化標準

2025-09-03 07:39:06

2011-07-08 11:13:42

Cocoa Touch XCode

2016-03-25 11:18:23

中華網

2020-05-14 18:04:20

Spring BootSaaS平臺

2009-06-25 16:04:30

2010-01-04 13:09:51

Silverlight

2011-05-17 09:39:38

JavaSE

2011-08-19 13:13:14

struts2Java

2024-08-01 09:10:03

2009-02-04 15:04:13

2024-09-04 10:27:53

2009-12-29 15:05:29

WPF支持國際化

2010-03-02 16:44:59

CentOS Mono

2024-05-17 08:25:06

數據驅動React語言包

2017-01-09 16:24:07

滴滴Android 端 App

2024-01-17 10:16:22

前端國際化消息鍵
點贊
收藏

51CTO技術棧公眾號

成人黄色在线视频| 久久激情电影| 91国在线观看| 91免费网站视频| 欧美特级特黄aaaaaa在线看| 久久精品一区二区国产| www.日韩系列| 亚洲最大免费视频| 24小时成人在线视频| 五月激情丁香一区二区三区| 亚洲精品一区二区三区樱花| 亚洲精品97久久中文字幕| 日日夜夜精品视频免费| 欧美激情一区二区三区高清视频| 日韩女同一区二区三区| 国产精品毛片av| 9191国产精品| 91视频免费版污| 98色花堂精品视频在线观看| 国产精品成人免费在线| 青青草原成人| 特黄视频在线观看| 国产福利91精品一区| 国产精品伦子伦免费视频| 日韩欧美性视频| 欧美婷婷在线| 欧美精品一区在线播放| www成人啪啪18软件| 亚洲警察之高压线| 亚洲第一网站免费视频| 潘金莲一级淫片aaaaaaa| 成人在线免费av| 色婷婷综合久久久久中文| 日本xxxxxxxxxx75| 超碰在线网站| 亚洲一区在线观看免费 | 亚洲素人在线| 精品国产一区二区三区久久久蜜月 | 精品国产乱码久久久久久老虎| 国产成年人视频网站| 国精产品一区一区三区四川| 精品久久在线播放| 波多野结衣50连登视频| 欧美亚洲日本精品| 色综合久久天天| www.四虎成人| 日韩成人高清| 欧美性色黄大片| 嫩草影院国产精品| 国产亚洲精彩久久| 欧美日韩精品一区二区三区蜜桃| 手机在线免费观看毛片| 素人啪啪色综合| 欧美日韩国产一区二区三区地区| 99热一区二区| 一区二区三区日本视频| 6080亚洲精品一区二区| 两女双腿交缠激烈磨豆腐| 日韩精品一区二区三区中文| 欧美成人精精品一区二区频| 在线观看免费视频国产| 黄色美女久久久| 精品一区电影国产| 卡一卡二卡三在线观看| 成人直播大秀| 色综合久久久888| 日韩少妇高潮抽搐| 日韩av一区二区在线影视| 国产欧美久久一区二区| av资源免费看| 99riav久久精品riav| 欧美另类一区| 欧美一级二级三级区| 亚洲男人的天堂一区二区| 国产精品久久久久9999爆乳| 蜜桃av.网站在线观看| 色噜噜狠狠色综合欧洲selulu| 日日噜噜夜夜狠狠| 香蕉免费一区二区三区在线观看| 亚洲大胆美女视频| 欧美偷拍一区二区三区| 亚洲国产不卡| 51精品国产黑色丝袜高跟鞋| 中文字幕激情视频| 国产精品一区二区久久不卡| 精品一卡二卡三卡四卡日本乱码| 成人综合影院| 亚洲一区二区影院| 99草草国产熟女视频在线| 国产麻豆精品| 亚洲深夜福利网站| 免费三级在线观看| 亚欧成人精品| 114国产精品久久免费观看| 无码精品一区二区三区在线| 国产精品久久久一本精品| 岛国大片在线播放| 国产黄色一区| 日韩精品黄色网| 国产97免费视频| 久久五月激情| 国产精品裸体一区二区三区| 成人性爱视频在线观看| 五月天亚洲婷婷| 亚洲高清在线不卡| 精品一区在线| 国内精品小视频在线观看| 中文字幕久久熟女蜜桃| www.日本不卡| 久久久无码中文字幕久...| 欧洲一级精品| 亚洲精品久久久久久下一站| 91人妻一区二区三区蜜臀| 日韩高清不卡一区| 国外成人在线视频网站| 50度灰在线| 欧美日韩日本视频| 日韩一区二区a片免费观看| 99热这里只有精品8| 99re视频| 岛国成人毛片| 欧美美女直播网站| 在线视频第一页| 久久精品卡一| 久久久精品动漫| av成人 com a| 精品成人佐山爱一区二区| 性欧美videos| 精品一区二区免费| 亚洲一区二区三区免费看| 经典三级一区二区| 亚洲欧美国产制服动漫| 五月婷婷中文字幕| 91小视频在线| www国产黄色| 欧美影院天天5g天天爽| 午夜精品视频网站| 天堂中文网在线| 精品久久久国产| 内射中出日韩无国产剧情| 在线视频精品| 免费毛片一区二区三区久久久| 精精国产xxx在线视频app| 亚洲国产精品一区二区三区| 国产精彩视频在线| 不卡视频一二三四| 免费国产黄色网址| 天海翼亚洲一区二区三区| 欧美在线一级va免费观看| 亚洲av成人精品一区二区三区在线播放 | 日韩精品免费一区二区三区竹菊| 午夜精品蜜臀一区二区三区免费 | 亚洲日本va| 欧美激情视频在线观看| 成人小说亚洲一区二区三区| 亚洲国产一区二区三区| 国产乱了高清露脸对白| 夜夜爽av福利精品导航| 欧美久久在线| 四虎视频在线精品免费网址| 九九久久综合网站| 神马午夜精品95| 色偷偷一区二区三区| 毛片久久久久久| 国产一区二区在线看| 国产在线xxxx| 图片婷婷一区| 国产精品中文字幕在线| 少妇av在线| 精品五月天久久| 正在播放亚洲精品| 一区二区三区在线播| 日韩av一二区| 激情深爱一区二区| 午夜免费福利小电影| 日韩三级视频| 日韩美女福利视频| 国产91在线视频蝌蚪| 亚洲精品黄网在线观看| 亚洲自拍偷拍另类| 亚洲国产综合91精品麻豆| 国产三级av在线播放| 国产在线精品不卡| 黄色免费视频大全| 亚洲成av人电影| 国产一区视频观看| 欧美videos粗暴| 69视频在线免费观看| 日本中文字幕在线观看| 精品成人佐山爱一区二区| 国产精品午夜一区二区| 亚洲亚洲人成综合网络| 欧洲女同同性吃奶| 国产精品资源在线| 国产福利影院在线观看| 激情综合在线| 一区不卡字幕| 亚洲人成网亚洲欧洲无码| 亚洲精品欧美一区二区三区| 亚洲校园激情春色| 欧美大片免费观看| 五月婷婷在线视频| 精品香蕉一区二区三区| 丰满肉嫩西川结衣av| 欧美日韩视频在线一区二区| 日韩精品手机在线| 亚洲乱码日产精品bd| 免费黄色片网站| 久久麻豆一区二区| 亚洲天堂av网站| 国产在线精品视频| 成人性生交免费看| 久久亚洲风情| 亚洲熟女乱色一区二区三区| 国模吧视频一区| 中文字幕乱码一区二区三区| 精品一区电影| 欧美一区二区高清在线观看| 2020国产精品极品色在线观看| 成人免费网站在线看| 成人自拍视频网| 国产成人综合亚洲| 日本久久免费| 4p变态网欧美系列| 日韩精品av| 97在线日本国产| 成人免费一区二区三区牛牛| 久久99久国产精品黄毛片入口| 最新av网站在线观看| 在线观看91久久久久久| 国产在线三区| 亚洲欧美福利视频| 麻豆国产在线播放| 精品视频偷偷看在线观看| 日韩在线观看视频网站| 亚洲福利在线看| 欧美 日韩 国产 成人 在线 91| 日韩欧美成人午夜| 性色av蜜臀av| 精品国产电影一区二区| 亚洲欧美强伦一区二区| 亚洲成人网在线观看| 少妇高潮一区二区三区99小说| 欧美精品一区二区在线播放| 可以免费看毛片的网站| 精品电影一区二区| 天堂v视频永久在线播放| 日韩av中文字幕在线播放| 日本五码在线| 亚洲系列中文字幕| 成人h小游戏| 久久精品国产亚洲精品2020| a免费在线观看| 色综合视频一区中文字幕| 国内激情视频在线观看| 人人爽久久涩噜噜噜网站| 欧美free嫩15| 成人黄色影片在线| 8848成人影院| 久草一区二区| 日韩av片子| 草草草视频在线观看| 亚洲三级色网| 久久精品视频91| 韩国成人福利片在线播放| 中文字幕第六页| 99精品视频在线免费观看| 日韩人妻无码精品综合区| 成人欧美一区二区三区白人| 九九九在线视频| 日韩欧美国产免费播放| 中文字幕在线网站| 欧美成人三级电影在线| 香蕉视频国产在线| 日韩中文字幕免费看| 日韩免费影院| 国产成人综合精品| 亚洲国产精品免费视频| 欧美系列一区| 欧美一区二区三区久久精品| 欧美日韩黄色一级片| 久久国产精品第一页| 日批在线观看视频| 国产精品久久久久久久午夜片 | 午夜日韩视频| 国产a级片免费观看| 国产精品资源网| 国产女主播喷水高潮网红在线| 国产精品国产精品国产专区不片| 国产大片中文字幕在线观看| 欧美中文字幕久久| 国产 日韩 欧美 综合| 在线播放精品一区二区三区| 欧美24videosex性欧美| 国产精品久久久av| 成人爽a毛片免费啪啪红桃视频| 亚洲福利av| 国产模特精品视频久久久久| 亚洲一区二区偷拍| 久久精品亚洲麻豆av一区二区| 国产一级特黄视频| 欧美精品电影在线播放| 可以在线观看的av| 欧美激情喷水视频| 自拍偷拍亚洲| 亚洲电影一二三区| 久久国产日韩| 91九色蝌蚪porny| 亚洲男人的天堂在线aⅴ视频| 国产一级片一区二区| 亚洲美女自拍视频| 国产乱码精品一区二三赶尸艳谈| 亚洲综合第一页| 97精品国产福利一区二区三区| 虎白女粉嫩尤物福利视频| 成人激情小说乱人伦| 中文字幕另类日韩欧美亚洲嫩草| 日本韩国欧美三级| 四虎国产精品永远| 97激碰免费视频| 99re8这里有精品热视频免费| 在线观看欧美亚洲| 麻豆免费精品视频| 亚洲AV无码成人精品区明星换面| 日韩欧美一区二区在线| 性感美女福利视频| 性欧美视频videos6一9| 2020国产精品极品色在线观看| a级片一区二区| 国产一区二区三区观看| 91视频青青草| 777欧美精品| 九七电影韩国女主播在线观看| 国产精选久久久久久| 成人午夜国产| 中国黄色片免费看| 中文字幕一区二区三| 一级全黄少妇性色生活片| 色先锋资源久久综合5566| 日本一区二区中文字幕| 在线观看成人一级片| 狠狠色丁香久久婷婷综| 男的操女的网站| 精品福利一二区| 黄视频免费在线看| 国产原创精品| 久久高清一区| 国产又粗又猛又爽又黄av| 欧美性猛交xxxx乱大交退制版| 国产高清在线看| 国产一区在线播放| 欧美成人69| 青青草视频网站| 日韩欧美高清在线视频| 福利在线视频导航| 成人免费看黄网站| 国产精品videosex极品| 国产福利在线观看视频| 色婷婷狠狠综合| 尤物网在线观看| 91手机在线播放| 日韩视频中文| 成人做爰69片免网站| 欧美精品在线观看一区二区| 亚洲精品天堂| 久久人人九九| 久久精品国产精品亚洲精品| 波多野结衣爱爱视频| 日韩高清免费在线| 国产精品成人国产| 国产精品69久久久| 国产欧美日本一区视频| 国产毛片毛片毛片毛片毛片| 欧美激情视频网址| 青青草原综合久久大伊人精品| 免费黄频在线观看| 欧美性色视频在线| 国产原创精品视频| 久久亚洲免费| 极品销魂美女一区二区三区| 日韩精品一区二区三| 中文在线不卡视频| 成人在线视频你懂的| 看欧美ab黄色大片视频免费| 亚洲自拍偷拍av| eeuss影院www在线播放| 国产精品手机在线| 久久成人麻豆午夜电影| 国产午夜在线播放| 久久精品中文字幕电影| 欧美网色网址| 日本美女久久久| 欧美伊人久久久久久久久影院 | 爱久久·www| 成人资源视频网站免费| 美国三级日本三级久久99| 日韩三级视频在线| 欧美精品少妇videofree| 清纯唯美日韩| 手机免费看av片|