java注解作为另一个注解的快捷方式

4zcjmb1e  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(393)

我同时使用spring数据mongodb和elasticsearch,并实时同步它们。
我对这两种情况使用相同的spring实体,如下所示:

// imports and stuff
@Document(collection="something")
@org.springframework.data.elasticsearch.annotations.Document(indexName = "something")
public class MySomething {
// class definition...

这个很好用。。。我的问题是,我想用一个“快捷方式”注解替换elasticsearch注解的完全限定名,比如 @ElasticDocument .
一种解决办法是复制 @Doucment 完全转换成一个新的注解,然后用新注解覆盖它的多个用法=>这将创建大量不必要的代码(考虑到我必须覆盖多个spring data elasticsearch配置类),这只是出于美观的原因!
还有更优雅的解决方案吗?涉及“重命名”的 @Document 或者为它创建快捷方式注解?
我似乎想不出一个合适的解决办法 @interface 多态性在java中是不可能的。

vuktfyat

vuktfyat1#

不确定这是不是正确的答案,但是你考虑过看一下spring的答案吗 @AliasFor 注解?它可能就是你要找的。例如,您可以尝试这样的方法,看看效果如何:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface ElasticDocument {

    @AliasFor(annotation = Document.class, attribute = "indexName")
    String indexName() default "";

    @AliasFor(annotation = Document.class, attribute = "type")
    String type() default "";

    @AliasFor(annotation = Document.class, attribute = "useServerConfiguration")
    boolean useServerConfiguration() default false;

    @AliasFor(annotation = Document.class, attribute = "shards")
    short shards() default 5;

    @AliasFor(annotation = Document.class, attribute = "replicas")
    short replicas() default 1;

    @AliasFor(annotation = Document.class, attribute = "refreshInterval")
    String refreshInterval() default "1s";

    @AliasFor(annotation = Document.class, attribute = "indexStoreType")
    String indexStoreType() default "fs";

    @AliasFor(annotation = Document.class, attribute = "createIndex")
    boolean createIndex() default true;

    @AliasFor(annotation = Document.class, attribute = "versionType")
    VersionType versionType() default VersionType.EXTERNAL;

}

注意,我还没有测试上面的代码,但是你可以试试看它是如何运行的。

相关问题