【问题标题】:Inheritance in annotation parameters注释参数中的继承
【发布时间】:2012-02-13 22:16:41
【问题描述】:

我正在尝试在 java 接口中继承以下参数(来自 Spring Data JPA 的示例,但问题通常是关于注释的参数):

public interface ItemRepository<T extends Item> extends BaseRepository<T> {

    public final String type = null;



    @Query("select distinct i from " + type + " i " +
            "join i.tags t " +
            "join fetch i.locale where t = ?1")
    public List<T> findByTag(Tag t);
}

所以在继承的接口中我可以:

public interface EventRepository extends ItemRepository<Event> {

    public final static String type = "Event";
}

但不幸的是,变量“type”的字符串值关联到变量的时间太晚了,所以在创建注解时,该值仍然为null。我可以强制编译器从子接口关联变量吗?

谢谢

【问题讨论】:

  • 我相信这就是单例模式的用途。
  • 但这些是接口,而不是类。你能详细说明一下吗?我很感兴趣! :)

标签: java inheritance annotations spring-data


【解决方案1】:

简而言之,没有。您不能强制编译器“将变量与子接口关联”。

Java 编译器需要能够在编译时确定所有注解值。它需要在ItemRepository 的类文件中写出一个常量值以放入@Query 注释中。您认为这对您的代码来说是什么常量值?

碰巧的是,编译器可以在编译时从您的代码中确定此注解的值。但是,它并不完全是您想要的值。 (我假设您不小心从 ItemRepository 中的字段 type 中省略了 static 修饰符 - 我相信您的代码不会编译,如果您替换了 type 字段,它也不会编译使用getType() 方法。)

您的代码看起来可以在编译时确定子接口的注释值。问题在于它不可能在编译时确定超级接口ItemRepository 的注释值。

【讨论】:

    【解决方案2】:

    我不是 Java 专家,但我认为你做不到。家长班对孩子一无所知。但是,您可以执行以下操作:

    public interface ItemRepository<T extends Item> extends BaseRepository<T> {
    
        public final String type = null;
    
        public static final String QUERY_PART1 = "select distinct i from ";
        public static final String QUERY_PART2 = " i " + 
                "join i.tags t " +
                "join fetch i.locale where t = ?1";
        public List<T> findByTag(Tag t);
    }  
    
    public interface EventRepository extends ItemRepository<Event> {
    
        public final static String type = "Event";
    
         @Query(QUERY_PART1 + type + QUERY_PART2)
    }
    

    【讨论】:

      【解决方案3】:

      最后,我对行为和不灵活感到非常不满,所以我给自己写了一个小工具。使用示例如下:

      https://github.com/knyttl/Maite/wiki/Maite-Persistence

      有两个子类和定义功能的父类。但诀窍在于构建查询的流畅界面。你怎么看?

      【讨论】:

        猜你喜欢
        • 2012-03-20
        • 2015-10-01
        • 1970-01-01
        • 2011-06-15
        • 2016-05-20
        • 2013-08-31
        • 2014-02-19
        • 2011-04-15
        • 1970-01-01
        相关资源
        最近更新 更多