2012-05-15 1 views
17

のannotaionsを継承するクラスのことが可能です私は、トランザクション管理のためのSpring Frameworkのトランザクションのアノテーションを使用していますし、下図のように私は@Transactionalを注釈付き抽象クラスを持っている:はスーパークラス

package org.tts.maqraa.service; 

import java.util.Collection; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Set; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityNotFoundException; 
import javax.persistence.PersistenceContext; 
import javax.persistence.PersistenceContextType; 
import javax.persistence.Query; 

import org.springframework.transaction.annotation.Propagation; 
import org.springframework.transaction.annotation.Transactional; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

/** 
* Parts of this code have been copied from JARVANA site. 
* 
* @author Younis alomoush 
* 
*/ 
@Transactional(propagation=Propagation.REQUIRED) 
public abstract class AbstractMaqraaService implements MaqraaService { 


    private Logger logger = LoggerFactory.getLogger(this.getClass()); 


    private int defaultMaxResults = DEFAULT_MAX_RESULTS; 

    @PersistenceContext(type=PersistenceContextType.TRANSACTION) 
    private EntityManager em; 
    /** 
    * The {@link EntityManager} which is used by all query manipulation and 
    * execution in this DAO. 
    * 
    * @return the {@link EntityManager} 
    */ 
    public EntityManager getEntityManager(){ 

     return em; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#getTypes() 
    */ 
    public abstract Set<Class<?>> getTypes(); 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#store(java.lang.Object) 
    */ 
    @Transactional(propagation = Propagation.REQUIRED) 
    public <T extends Object> T store(T toStore) { 
     return getEntityManager().merge(toStore); 

    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#remove(java.lang.Object) 
    */ 
    @Transactional(propagation = Propagation.REQUIRED) 
    public void remove(Object toRemove) { 
     toRemove = getEntityManager().merge(toRemove); 
     getEntityManager().remove(toRemove); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#flush() 
    */ 
    @Transactional(propagation = Propagation.REQUIRED) 
    public void flush() { 
     getEntityManager().flush(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#refresh(java.lang.Object) 
    */ 
    @Transactional(propagation = Propagation.SUPPORTS) 
    public void refresh(Object o) { 
     try { 
      if (o != null) { 
       if (o instanceof java.util.Collection) { 
        for (Iterator<?> i = ((Collection<?>) o).iterator(); i 
          .hasNext();) { 
         try { 
          refresh(i.next()); 
         } catch (EntityNotFoundException x) { 
          // This entity has been deleted - remove it from the 
          // collection 
          i.remove(); 
         } 
        } 
       } else { 
        if (getTypes().contains(o.getClass())) { 
         getEntityManager().refresh(o); 
        } 
       } 
      } 
     } catch (EntityNotFoundException x) { 
      // This entity has been deleted 
     } 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#setDefaultMaxResults(int) 
    */ 
    @Transactional(propagation = Propagation.SUPPORTS) 
    public void setDefaultMaxResults(int defaultMaxResults) { 
     this.defaultMaxResults = defaultMaxResults; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#getDefaultMaxResults() 
    */ 
    public int getDefaultMaxResults() { 
     return defaultMaxResults; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByNameSingleResult(java 
    * .lang.String) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> T executeQueryByNameSingleResult(String queryName) { 
     return (T) executeQueryByNameSingleResult(queryName, (Object[]) null); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByNameSingleResult(java 
    * .lang.String, java.lang.Object[]) 
    */ 

    @SuppressWarnings("unchecked") 
    public <T extends Object> T executeQueryByNameSingleResult(
      String queryName, Object... parameters) { 
     Query query = createNamedQuery(queryName, DEFAULT_FIRST_RESULT_INDEX, 
       1, parameters); 
     return (T) query.getSingleResult(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String) 
    */ 
    public <T extends Object> List<T> executeQueryByName(String queryName) { 
     return executeQueryByName(queryName, DEFAULT_FIRST_RESULT_INDEX, 
       getDefaultMaxResults()); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String, 
    * java.lang.Integer, java.lang.Integer) 
    */ 

    public <T extends Object> List<T> executeQueryByName(String queryName, 
      Integer firstResult, Integer maxResults) { 
     return executeQueryByName(queryName, firstResult, maxResults, 
       (Object[]) null); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String, 
    * java.lang.Object[]) 
    */ 

    public <T extends Object> List<T> executeQueryByName(String queryName, 
      Object... parameters) { 
     return executeQueryByName(queryName, DEFAULT_FIRST_RESULT_INDEX, 
       getDefaultMaxResults(), parameters); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String, 
    * java.lang.Integer, java.lang.Integer, java.lang.Object[]) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> List<T> executeQueryByName(String queryName, 
      Integer firstResult, Integer maxResults, Object... parameters) { 
     Query query = createNamedQuery(queryName, firstResult, maxResults, 
       parameters); 
     return query.getResultList(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#createNamedQuery(java.lang.String, 
    * java.lang.Integer, java.lang.Integer) 
    */ 

    public Query createNamedQuery(String queryName, Integer firstResult, 
      Integer maxResults) { 
     return createNamedQuery(queryName, firstResult, maxResults, 
       (Object[]) null); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#createNamedQuery(java.lang.String, 
    * java.lang.Integer, java.lang.Integer, java.lang.Object[]) 
    */ 

    public Query createNamedQuery(String queryName, Integer firstResult, 
      Integer maxResults, Object... parameters) { 
     Query query = getEntityManager().createNamedQuery(queryName); 
     if (parameters != null) { 
      for (int i = 0; i < parameters.length; i++) { 
       query.setParameter(i + 1, parameters[i]); 
      } 
     } 

     query.setFirstResult(firstResult == null || firstResult < 0 ? DEFAULT_FIRST_RESULT_INDEX 
       : firstResult); 
     if (maxResults != null && maxResults > 0) 
      query.setMaxResults(maxResults); 

     return query; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#executeQuery(java.lang.String, 
    * java.lang.Integer, java.lang.Integer, java.lang.Object[]) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> List<T> executeQuery(String queryString, 
      Integer firstResult, Integer maxResults, Object... parameters) { 
     Query query = createQuery(queryString, firstResult, maxResults, 
       parameters); 
     return query.getResultList(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#executeQuery(java.lang.String, 
    * java.lang.Object[]) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> List<T> executeQuery(String queryString, 
      Object... parameters) { 
     Query query = createQuery(queryString, DEFAULT_FIRST_RESULT_INDEX, 
       getDefaultMaxResults(), parameters); 
     return query.getResultList(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQuerySingleResult(java.lang. 
    * String) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> T executeQuerySingleResult(String queryString) { 
     return (T) executeQuerySingleResult(queryString, (Object[]) null); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQuerySingleResult(java.lang. 
    * String, java.lang.Object[]) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> T executeQuerySingleResult(String queryString, 
      Object... parameters) { 
     Query query = createQuery(queryString, DEFAULT_FIRST_RESULT_INDEX, 1, 
       parameters); 
     return (T) query.getSingleResult(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#createQuery(java.lang.String, 
    * java.lang.Integer, java.lang.Integer) 
    */ 

    public Query createQuery(String queryString, Integer firstResult, 
      Integer maxResults) { 
     return createQuery(queryString, firstResult, maxResults, 
       (Object[]) null); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#createQuery(java.lang.String, 
    * java.lang.Integer, java.lang.Integer, java.lang.Object[]) 
    */ 
    public Query createQuery(String queryString, Integer firstResult, 
      Integer maxResults, Object... parameters) { 
     Query query = getEntityManager().createQuery(queryString); 
     if (parameters != null) { 
      for (int i = 0; i < parameters.length; i++) { 
       query.setParameter(i + 1, parameters[i]); 
      } 
     } 

     query.setFirstResult(firstResult == null || firstResult < 0 ? DEFAULT_FIRST_RESULT_INDEX 
       : firstResult); 
     if (maxResults != null && maxResults > 0) 
      query.setMaxResults(maxResults); 

     return query; 
    } 

    public final void log(LogLevel logLevel, String message, 
      Object... messageParam) { 

     switch (logLevel) { 
     case TRACE: 
      if (logger.isTraceEnabled()) { 

       logger.trace(message, messageParam); 
      } 

      break; 

     case DEBUG: 
      if (logger.isDebugEnabled()) { 

       logger.debug(message, messageParam); 
      } 
      break; 

     case INFO: 
      if (logger.isInfoEnabled()) { 

       logger.info(message, messageParam); 
      } 
      break; 

     case WARN: 
      if (logger.isWarnEnabled()) { 

       logger.warn(message, messageParam); 
      } 
      break; 

     case ERROR: 
      if (logger.isErrorEnabled()) { 

       logger.error(message, messageParam); 
      } 
      break; 

     default: 
      throw new IllegalArgumentException("Log Level is not defined: " 
        + logLevel); 

     } 

    } 

    public final void log(LogLevel logLevel, String message, Throwable throwable) { 

     switch (logLevel) { 
     case TRACE: 
      if (logger.isTraceEnabled()) { 

       logger.trace(message, throwable); 
      } 

      break; 

     case DEBUG: 
      if (logger.isDebugEnabled()) { 

       logger.debug(message, throwable); 
      } 
      break; 

     case INFO: 
      if (logger.isInfoEnabled()) { 

       logger.info(message, throwable); 
      } 
      break; 

     case WARN: 
      if (logger.isWarnEnabled()) { 

       logger.warn(message, throwable); 
      } 
      break; 

     case ERROR: 
      if (logger.isErrorEnabled()) { 

       logger.error(message, throwable); 
      } 
      break; 

     default: 
      throw new IllegalArgumentException("Log Level is not defined: " 
        + logLevel); 

     } 

    } 


    public enum LogLevel{ 

     TRACE, DEBUG, INFO, WARN, ERROR; 

    } 
} 

また、私が持っています別の具体的なクラス

package org.tts.maqraa.service; 

import java.lang.annotation.Annotation; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 
import org.tts.maqraa.data.Student; 


public class StudentsService extends AbstractMaqraaService { 

    @Override 
    public Set<Class<?>> getTypes() { 
     Set<Class<?>> set = new HashSet<Class<?>>(); 
     set.add(Student.class); 
     return set; 
    } 

    public Student registerStudent(Student student) { 
     Annotation [] annotation = StudentsService.class.getAnnotations(); 
     System.out.println(annotation); 
     return this.store(student); 
    } 

    public Student editStudent(Student student){ 
     return this.store(student); 
    } 

    public void deregisterStudent(Student student){ 
     this.remove(student); 
    } 

    public List<Student> findAllStudents(){ 
     return this.executeQueryByName("Student.findAll"); 
    } 

} 

あなたはメソッド・レジスタの学生は、すでに私は本当に@Transactional注釈を見つけるの注釈を調べるためのコードを提供していることに気付いた場合。

これは、アノテーションの継承について別のリンクが話されている矛盾であり、継承がまったくないと言います。

レビューこのリンク:http://fusionsoft-online.com/articles-java-annotations.php

誰もがこの矛盾を解決するために私を助けることができますか?

答えて

14

注釈の継承は、基本的にメソッドやフィールドの継承と同じ方法で動作します。

あなただけの反射により注釈にアクセスすることができますので、Classにおける2つの基本的な方法があります。

  • getAnnotations()戻り、現在のすべてのクラスの注釈とそのスーパークラス
  • getDeclaredAnnotations()戻り、現在のクラスのすべての注釈は、

あなたがリンクしている記事の問題は、Method#getAnnotation(...)は、クラスthのdeclaredAnnotations() eメソッドが定義されています。これは、上で述べたように、スーパークラスのアノテーションではなく、そのクラスで定義されたアノテーションのみを返します。

これは、あなたが@Transactionalで注釈が付け方法のいずれかをオーバーライドする場合は、(フレームワークは、クラスの注釈に見える場合、またはそれが@TransactionalAbstractMaqraaServiceで宣言見つける必要があります)が注釈を追加する必要があるだろうことを意味します。

29

はいアノテーションに@Inheritedが追加されている可能性があります。たとえば、@Transactional注釈は@Inheritedです。ドキュメントから

は注釈型が自動的に継承されることを示します。 継承されたメタ注釈が注釈タイプ 宣言に存在し、ユーザーがクラス 宣言の注釈タイプを照会し、クラス宣言にこの タイプの注釈がない場合、クラスのスーパークラスが自動的に照会されます。 注釈の種類。このプロセスは、このタイプの注釈 が見つかるまで、またはクラス階層(オブジェクト)の先頭に到達するまで繰り返されます( )。スーパークラスにこのタイプのアノテーションがない場合、 クエリは、そのクラスがそのアノテーションを持たないことを示します。

注釈付きの タイプを使用してクラス以外のものに注釈を付ける場合、このメタ注釈タイプは効果がないことに注意してください。 このメタ注釈は、注釈が スーパークラスから継承されるだけです。実装されたインタフェースのアノテーションは効果がありません。 @Transactionalの

ドキュメント:トピックオフ

@Target(value={METHOD,TYPE}) 
@Retention(value=RUNTIME) 
@Inherited 
@Documented 
public @interface Transactional 

:あなたはJavaでいえ注釈をサブタイプすることはできません。

+0

@Inheritedは、クラスで(メソッドまたはインターフェイスではなく)適用された場合にのみ機能することに注意してください。 – AlexO

関連する問題