我同时使用Spring数据Mongodb和Elasticsearch并实时同步它们。
我在两种情况下都使用相同的Spring实体,如下所示:
// imports and stuff
@Document(collection="something")
@org.springframework.data.elasticsearch.annotations.Document(indexName = "something")
public class MySomething {
// class definition...
效果很好...我的问题是我想用“快捷方式”注释(例如@ElasticDocument
)替换elasticsearch注释的标准名称。一种解决方案是将
@Doucment
完全复制到新的注释中,然后使用新的注释覆盖它的多种用法=>这将创建大量不必要的代码(考虑到我将不得不覆盖多个Spring数据elasticsearch配置类)。审美原因!还有另一个更优雅的解决方案吗?其中一项涉及“重命名”
@Document
或为其创建快捷方式注释?考虑到Java中
@interface
多态性是不可能的,我似乎没有想到合适的解决方案。
最佳答案
不太确定这是否是正确的答案,但是您是否考虑过看一下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;
}
注意,我没有测试上面的代码,但是您可以尝试一下,看看它如何进行。
关于java - 批注作为另一个批注的快捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64450937/