精品欧美一区二区三区在线观看 _久久久久国色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丨porny丨最新| 久久在精品线影院精品国产| 亚洲熟妇av一区二区三区| 午夜美女福利视频| 久久精品亚洲人成影院 | 成人影视免费观看| sm国产在线调教视频| 成人羞羞网站入口| 第一福利永久视频精品| 肥熟一91porny丨九色丨| 在线观看黄网址| 日韩电影免费观| 99麻豆久久久国产精品免费| 欧美激情videoshd| 精品人妻一区二区三区视频| 亚洲ww精品| 中文欧美字幕免费| 国产精品电影一区| 在线国产视频一区| 日韩免费小视频| 久久久久久久av麻豆果冻| 97在线看福利| 国产免费一区二区三区最新6| 伊人福利在线| 国产成人99久久亚洲综合精品| 久久久精品国产一区二区| 777一区二区| 麻豆免费在线视频| 欧美一区二区公司| 亚洲欧美小说色综合小说一区| 国产一区中文字幕| 久久久精品中文字幕| 97人妻天天摸天天爽天天| 九九色在线视频| 懂色av一区二区夜夜嗨| 久久久av网站| av女人的天堂| 青青草原在线亚洲| 欧美性生交xxxxxdddd| 久久精品国产美女| 无码无套少妇毛多18pxxxx| 国产精品一区二区av交换| 欧洲在线/亚洲| 在线视频欧美一区| 精品国自产拍在线观看| 老司机一区二区| 欧美老少做受xxxx高潮| 黄色性视频网站| 精品国产第一国产综合精品| 亚洲综合一区二区三区| 久久99精品久久久久久水蜜桃| 国产内射老熟女aaaa∵| 国语自产精品视频在线看8查询8| 日韩成人在线视频| 黄色片在线免费| 亚洲天堂免费电影| 午夜视频在线观看一区二区三区| 欧日韩一区二区三区| 中文字幕资源网| 影音先锋一区| 在线视频欧美日韩| 久久久久无码精品| 中文字幕人成乱码在线观看| 亚洲成人中文在线| 亚洲一二三区精品| 黄色一级大片在线免费看国产| 亚洲女优在线| 欧美成人精品在线观看| 午夜视频在线观看一区二区三区| 五月天丁香综合久久国产| 国产免费黄色网址| 精品一区二区三区在线播放视频| 国语自产精品视频在线看一大j8| 精品无人区无码乱码毛片国产| 亚洲精品动态| 欧美成人一区二区三区片免费 | 欧美日韩国内自拍| 免费成人在线视频网站| 尤物在线视频| 91碰在线视频| 日韩精彩视频| 天堂中文资源在线观看| 极品少妇xxxx精品少妇偷拍| 1024国产精品| 精品视频一区三区九区| 成人免费看片视频在线观看| 色网站在线免费观看| 激情综合亚洲精品| av噜噜色噜噜久久| 自拍偷拍精品视频| 亚洲一区激情| 国产精品亚洲аv天堂网| www.av麻豆| 欧美日本一区二区视频在线观看| 上原亚衣av一区二区三区| 538国产视频| 一区二区三区视频免费视频观看网站| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 四虎免费在线观看视频| 欧美亚洲日本| 亚洲视频在线一区观看| 亚洲国产精品久久久久久女王| 熟妇人妻中文av无码| 国产日韩欧美制服另类| 欧美日韩国产精品一卡| 国产91免费在线观看| 久久久久久日产精品| japanese在线视频| www.日韩| 欧美日韩在线一区| 亚洲最大综合网| 成人性生活av| 日韩一区和二区| 久久久九九九热| 综合久久av| 91麻豆精品国产91久久久久久久久| 亚洲高清在线免费观看| 91精品入口| 搡老女人一区二区三区视频tv| 国产精品老女人| 国产精品日本欧美一区二区三区| 国内伊人久久久久久网站视频| 自拍偷拍色综合| 99麻豆久久久国产精品免费| 欧美日韩午夜爽爽| 182tv在线播放| 欧洲另类一二三四区| 国产精品一区二区无码对白| 99久久.com| 日韩一区精品字幕| 日韩精品一区二区三区中文精品| 泷泽萝拉在线播放| 好看的亚洲午夜视频在线| 国产日韩欧美视频| 国产视频手机在线| 日本一区免费视频| 中文字幕欧美人与畜| 亚洲三级欧美| 亚洲激情自拍图| 熟女少妇一区二区三区| 亚洲青色在线| 国产精品成人一区二区三区吃奶| 日韩在线观看视频一区二区三区 | 精品一区二区久久久久久久网站| 丁香花免费高清完整在线播放| 国产精品免费看片| 国产免费内射又粗又爽密桃视频| 后进极品白嫩翘臀在线播放| 国产欧美1区2区3区| 久久9精品区-无套内射无码| 男人的天堂久久| 久久久这里只有精品视频| 午夜美女福利视频| 亚洲国产视频直播| 国产乱子夫妻xx黑人xyx真爽| 岛国成人av| 国产亚洲精品久久久| √天堂中文官网8在线| 亚洲精品女人| 国产在线视频欧美一区二区三区| 第一福利在线| 一区二区不卡在线视频 午夜欧美不卡在| 欧美在线aaa| 国内精品国产成人国产三级粉色| 欧美激情成人在线视频| 亚洲精品视频专区| 国产日韩精品一区二区三区在线| 国产综合免费视频| 国产精品探花在线观看| 国产精品视频一区二区高潮| www.日韩高清| 午夜视频久久久久久| 国产精品伦子伦| 久久三级视频| 国产精品一区二区三区四区五区 | 日韩欧美亚洲国产| 麻豆91精品视频| 一区二区三区四区免费视频| 精品国产一级| 97视频在线观看亚洲| 九色在线观看视频| 亚洲成人在线网站| 亚洲区免费视频| 亚洲区欧美区| 日本一区免费观看| 日韩一级特黄| 久久久视频在线| 国产高清免费av在线| 欧美一级在线免费| 久久久久无码精品国产sm果冻| 欧美日本不卡| 奇米精品在线| 136国产福利精品导航网址应用| 欧美一级淫片丝袜脚交| 成人免费一级视频| 91福利区一区二区三区| 黄色工厂在线观看| 美女视频网站黄色亚洲| 日韩av电影免费在线观看| 四虎视频在线精品免费网址| 久久久久久久国产精品| 精品人妻一区二区三区麻豆91| 亚洲国产精品一区二区www在线| 欧美老熟妇乱大交xxxxx | 国产精品国产亚洲伊人久久| 91麻豆一二三四在线| 亚洲精品有码在线| 国产www在线| av亚洲精华国产精华精华| 浓精h攵女乱爱av| 黄页网站一区| 一区二区三区四区在线视频| 欧美aaaaa级| 色一情一乱一乱一区91av| 国产又粗又猛又爽又黄的网站| 中文字幕日韩三级片| 日韩电影网1区2区| 2018中文字幕第一页| 国产日韩一区二区三免费高清| 日韩中文第一页| 视频二区在线| 91官网在线免费观看| xxxxxx国产| 亚洲欧美视频在线观看| 极品人妻videosss人妻| 久久综合中文字幕| 一区二区三区韩国| 国产日韩欧美在线播放不卡| 久无码久无码av无码| 影音先锋日韩精品| 国产日本一区二区三区| japansex久久高清精品| 国产精品欧美激情在线播放| 成人爽a毛片免费啪啪| 97视频在线观看视频免费视频| 538在线观看| 国产一区二区三区在线观看视频 | 新片速递亚洲合集欧美合集| 午夜精品视频在线| av中文资源在线资源免费观看| 欧美黑人又粗大| 蜜臀av在线| 日韩精品在线观看一区二区| www.黄色片| 欧美一级一区二区| 天堂网中文字幕| 国产欧美日韩视频在线观看| 岛国大片在线免费观看| 国产精品99久| 欧美视频在线第一页| 成人羞羞网站| 欧美aaa在线观看| 日韩在线看片| 97se国产在线视频| 人人视频精品| 热久久免费视频精品| 爱啪视频在线观看视频免费| 欧美一二三视频| 午夜影院一区| 欧亚精品中文字幕| 四虎成人在线| 欧美久久久精品| 男女视频在线观看网站| 川上优的av在线一区二区| 欧美精品丝袜久久久中文字幕| 麻豆精品国产免费| 国产精品三级av| 男女男精品视频网站| 中文字幕中文乱码欧美一区二区| 最新版天堂资源在线| 国产精品888| 成人h动漫精品一区| 91麻豆文化传媒在线观看| 国产九九九视频| 亚洲少妇一区| 日本福利视频在线| 亚洲国产高清一区| 免费日韩视频在线观看| 日本欧美大码aⅴ在线播放| 亚洲人成网站在线观看播放| 欧美一区二区三区另类| 久久久久久久久久久久久久一区 | 17c国产在线| 亚洲香蕉网站| 18禁裸男晨勃露j毛免费观看| 影音先锋日韩在线| 国产青青在线视频| 欧美丰满日韩| 免费日韩av电影| 一本色道69色精品综合久久| 鲁丝一区二区三区免费| 精品国产美女| 官网99热精品| 精品精品久久| www.亚洲一区二区| 日本道在线观看| 国产精品久久久久久久久搜平片 | 超碰在线97免费| 国产一区不卡精品| 永久av免费在线观看| 国产亚洲精久久久久久| 91久久久久久久久久久久久久| 午夜精彩视频在线观看不卡| 成年人视频免费| 亚洲日本韩国一区| 青青草免费av| 国产三级精品视频| 亚洲天堂一级片| 亚洲成av人影院| 小泽玛利亚一区二区三区视频| 日韩一卡二卡三卡四卡| 日本成人网址| 欧美一级免费看| 精品国产一区二| 在线视频欧美一区| 午夜综合激情| 91大神免费观看| 国产精品久久久久久妇女6080| 福利一区二区三区四区| 欧美三级韩国三级日本三斤| 亚欧洲精品视频| 亚洲成人av片| 午夜免费福利在线观看| 国产成人精品电影久久久| 欧美二区观看| 色乱码一区二区三在线看| 另类图片国产| 国产精品无码av在线播放| 国产精品一二三区| 9191在线视频| 欧美经典一区二区| 久久中文字幕在线观看| 亚洲一级二级三级在线免费观看| 国产一级片免费视频| 亚洲欧美在线x视频| 99热这里只有精品9| 在线成人av影院| 亚洲人妻一区二区| 久久久免费高清电视剧观看| 精品一区二区三区四区五区| 亚洲一区免费看| 日韩不卡在线观看日韩不卡视频| 伊人网综合视频| 18成人在线视频| 国产又粗又大又黄| 欧美熟乱第一页| 国产情侣一区二区| 久久影视免费观看| 亚洲综合资源| 亚洲国产精品一区二区第一页| 亚洲一区二区动漫| 亚洲在线成人精品| 久草国产在线视频| 日韩一区二区三区在线| 激情在线小视频| 欧美激情视频在线| 久久国产精品免费一区二区三区| 亚洲精品一区二| 国产一区二区久久| 黑人巨大精品一区二区在线| 欧美体内she精视频| 日本亚洲精品| 国产日本欧美在线观看| 综合久久久久| 亚洲成人激情小说| 亚洲日本乱码在线观看| 91肉色超薄丝袜脚交一区二区| 自拍偷拍亚洲精品| 精品一区二区三区在线观看视频| 伊人色综合影院| 日本中文一区二区三区| 性猛交娇小69hd| 欧美精品丝袜久久久中文字幕| 色女人在线视频| 91成人免费观看网站| 蜜臀av一区| 污污的网站免费| 自拍av一区二区三区| 日韩一级免费毛片| 欧美专区中文字幕| 精品一区亚洲| 国产女教师bbwbbwbbw| 成人高清视频在线观看| 污软件在线观看| 日韩免费看网站| 韩国精品一区| 亚洲精品国产精品国自产观看| 久久精品国产亚洲aⅴ| 精品无码av在线| 亚洲欧美在线免费观看| 欧美一级在线| 亚洲熟妇无码另类久久久| 欧美极品少妇xxxxⅹ高跟鞋| 欧美熟妇另类久久久久久不卡 |