Spring Boot Webアプリケーションの拡張-RESTFulインタフェースをカプセル化してデータを返す

3673 ワード

RESTFulインタフェースを提供する場合、これらのインタフェースから返されるデータは、呼び出し元に固定フォーマットで提供されることが望ましい場合があります.以下、戻りデータが固定jsonフォーマットにカプセル化されている例を示します.
データおよび構成クラスを返す
戻りデータクラスは汎用型を使用して異なるオブジェクトを含み、エラーコード、エラー情報、現在の時間の3つのフィールドがあり、lombokを使用してgetterとsetterを省略します.
@Data
public class CommonJsonResponse {

    public CommonJsonResponse() {    }
    public CommonJsonResponse(T respBody) {  this.respBody = respBody;   }

    private String errorCode = "";
    private String errorMsg = "";
    private T respBody;    
    public String getTimestamp() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(JSON.DEFFAULT_DATE_FORMAT));
    }
}

クラスの構成
  • @Configuration注記これは構成クラスであることを示し、
  • @Beanは、実際にはFastJsonHttpMessageConverterのインスタンスであり、「アプリケーション/json」または「アプリケーション/json;charset=UTF-8」のデータ型を返す変換のみをサポートするHttpMessageConvertersインスタンスの作成を表します.以前に追加した依存項目spring-cloud-starter-aliba-sentinelとsentinel-datasource-nacosはいずれもfastjson依存を含んでいるため、今回の変更では新しい依存項目を追加する必要はなく、上記の2つの依存項目はfastjsonの参照を1つだけ保持することができます.
  • @RestControllerAdviceはaopブロックを構成し、「com.example.quickstart.controller」パッケージの下をブロックするコントローラを指定します.戻りデータを書くときに判断し、戻りタイプがCommonJsonResponseクラスのインスタンスまたはMediaTypeが私たちが追加したコンバータでサポートしているタイプであれば、直接戻ったり包装したりしますが、他のタイプでは処理しません.
  • @Configuration
    public class WebConfig {
    
        @Bean
        public HttpMessageConverters customConverters() {
            //FastJsonHttpMessageConverter FastJsonConfig   charset  UTF-8
            FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
            converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON, 
                                                           MediaType.APPLICATION_JSON_UTF8));
            FastJsonConfig config = new FastJsonConfig();
            config.setSerializerFeatures(SerializerFeature.PrettyFormat,    //   json 
                                         SerializerFeature.WriteDateUseDateFormat);//      
            converter.setFastJsonConfig(config);
            return new HttpMessageConverters(converter);
        }
    
        @RestControllerAdvice("com.example.quickstart.controller")
        static class CommonJsonResponseResponseAdvice implements ResponseBodyAdvice {
            @Override
            public boolean supports(MethodParameter methodParameter,
                        Class extends HttpMessageConverter>> aClass) {
                return true;
            }
    
            @Override
            public Object beforeBodyWrite(Object body, MethodParameter methodParameter, 
                                MediaType mediaType,  Class extends HttpMessageConverter>> aClass,
                               ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
                if (body instanceof CommonJsonResponse) {
                    return body;
                } else if (MediaType.APPLICATION_JSON.equals(mediaType)
                        || MediaType.APPLICATION_JSON_UTF8.equals(mediaType)) {
                    return new CommonJsonResponse(body);
                }
                return body;
            }
        }
    }
    

    以上の2つのクラスを追加したら、comを呼び出します.example.quickstart.Controllerパッケージの下にあるRESTFulインタフェースの場合、デフォルトで「アプリケーション/json」またはproduces=「アプリケーション/json」を使用してデータ型の戻りを示す場合、戻り情報は次のような形式で返されます.
    {
        "errorCode":"",
        "errorMsg":"",
        "respBody":{
            "age":19,
            "birthday":"2000-04-01",
            "usercode":"001",
            "username":"test user"
        },
        "timestamp":"2019-11-17 21:18:23"
    }
    

    これにより,RESTFulインタフェースに対してデータを返すパッケージを簡単に実現した.