第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Spring 的編譯期間用另一個注釋替換一個注釋?

在 Spring 的編譯期間用另一個注釋替換一個注釋?

慕田峪7331174 2023-04-19 16:45:49
我在我的控制器參數(shù)上使用 Swagger 注釋。所以,我最終得到了像@ApiParam(name="default name", value="this is a default value"). 我認為這很冗長。我想把它改成類似的東西@Foo。我想知道是否有辦法在編譯期間@Foo替換為。@ApiParam另外,由于我使用的是 Spring,我想我也必須考慮 Spring 中的注釋處理順序。我的意思是我不應(yīng)該在 Swagger 或 Spring 接受它之后替換@ApiParam為。@Foo有什么辦法嗎?簡而言之,我使用了 5 次具有相同參數(shù)的相同注釋?;旧?,我想用一些自定義注釋替換它們。我知道我必須展示我已經(jīng)嘗試過的東西,但我不知道從哪里開始。另外,這個問題與Swagger無關(guān),它只是一個例子。我想在編譯時將一個注解替換為另一個注解,這樣 Spring 拾取的將不是我放在源代碼上的那個,而是我替換的那個。
查看完整描述

1 回答

?
慕碼人2483693

TA貢獻1860條經(jīng)驗 獲得超9個贊

如果我理解您的要求,則無需編譯時注釋處理即可實現(xiàn)。它并不漂亮,而且可能比它的價值更復(fù)雜,但這是一種方法。


這是我制作的自定義注釋,用于我的速記@ApiParam。


@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.PARAMETER)

public @interface GameIdParam {

    String name() default "My Game ID";


    String value() default "The integer ID of a particular game";

}

@ApiParam您可以定義您希望覆蓋的任何屬性。然后您可以使用Springfox 的擴展框架為新注釋實現(xiàn)自定義處理程序。


import com.google.common.base.Optional;

import io.swagger.annotations.ApiParam;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.core.annotation.AnnotationUtils;

import org.springframework.stereotype.Component;

import springfox.documentation.schema.Example;

import springfox.documentation.spi.DocumentationType;

import springfox.documentation.spi.schema.EnumTypeDeterminer;

import springfox.documentation.spi.service.contexts.ParameterContext;

import springfox.documentation.spring.web.DescriptionResolver;

import springfox.documentation.swagger.readers.parameter.ApiParamParameterBuilder;


import java.util.function.Predicate;


import static java.util.Optional.ofNullable;

import static springfox.documentation.swagger.common.SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER;

import static springfox.documentation.swagger.common.SwaggerPluginSupport.pluginDoesApply;

import static springfox.documentation.swagger.readers.parameter.Examples.examples;


@Component

public class ShorthandAnnotationPlugin extends ApiParamParameterBuilder {

    private final DescriptionResolver descriptions;

    private final EnumTypeDeterminer enumTypeDeterminer;


    @Autowired

    public ShorthandAnnotationPlugin(

            DescriptionResolver descriptions,

            EnumTypeDeterminer enumTypeDeterminer) {

        super(descriptions, enumTypeDeterminer);

        this.descriptions = descriptions;

        this.enumTypeDeterminer = enumTypeDeterminer;

    }


    @Override

    public void apply(ParameterContext context) {

        Optional<GameIdParam> gameIdParam = context.resolvedMethodParameter().findAnnotation(GameIdParam.class);


        if (gameIdParam.isPresent()) {

            GameIdParam annotation = gameIdParam.get();


            // Instantiate an ApiParam so we can take default values for attributes we didn't override.

            ApiParam parentAnnotation = AnnotationUtils.synthesizeAnnotation(ApiParam.class);


            context.parameterBuilder().name(ofNullable(annotation.name())

                    .filter(((Predicate<String>) String::isEmpty).negate()).orElse(null))

                    .description(ofNullable(descriptions.resolve(annotation.value()))

                            .filter(((Predicate<String>) String::isEmpty).negate()).orElse(null))

                    .parameterAccess(ofNullable(parentAnnotation.access())

                            .filter(((Predicate<String>) String::isEmpty).negate())

                            .orElse(null))

                    .defaultValue(ofNullable(parentAnnotation.defaultValue())

                            .filter(((Predicate<String>) String::isEmpty).negate())

                            .orElse(null))

                    .allowMultiple(parentAnnotation.allowMultiple())

                    .allowEmptyValue(parentAnnotation.allowEmptyValue())

                    .required(parentAnnotation.required())

                    .scalarExample(new Example(parentAnnotation.example()))

                    .complexExamples(examples(parentAnnotation.examples()))

                    .hidden(parentAnnotation.hidden())

                    .collectionFormat(parentAnnotation.collectionFormat())

                    .order(SWAGGER_PLUGIN_ORDER);

        }

    }


    @Override

    public boolean supports(DocumentationType documentationType) {

        return pluginDoesApply(documentationType);

    }

}

我以Springfox 的 ApiParamParameterBuilder為例。


現(xiàn)在,我可以用我的@GameIdParam


@PostMapping("/{gameId}/info")

public String play(@GameIdParam @PathVariable int gameId) // ...

這種模式可以推廣到與一系列自定義速記注釋一起工作。它并不漂亮,它引入了另一種間接級別,了解 Springfox Swagger 的人不會熟悉。


查看完整回答
反對 回復(fù) 2023-04-19
  • 1 回答
  • 0 關(guān)注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號