2017-06-25 12 views
0

私はKotlinでdropwizardサンプルアプリケーションを実装しており、DateRequiredFeatureを実装する際に問題があります。私は機能を持っているKotlin側についてはKotlinでのJavaアノテーションの実装

@Retention(RetentionPolicy.RUNTIME) 
    @Target(ElementType.METHOD) 
    public @interface DateRequired {} 

:として定義された注釈で

@Provider 
    public class DateRequiredFeature implements DynamicFeature { 
     @Override 
     public void configure(ResourceInfo resourceInfo, FeatureContext context) { 
      if (resourceInfo.getResourceMethod().getAnnotation(DateRequired.class) != null) { 
       context.register(DateNotSpecifiedFilter.class); 
      } 
     } 
    } 

:Javaコードのコードは次のとおりです

@Provider 
    class DateRequiredFeature : DynamicFeature(){ 
     override fun configure(resourceInfo: ResourceInfo, context: FeatureContext) { 
      if (resourceInfo.resourceMethod.getAnnotation(DateRequired::class.java) != null) { 
       context.register(DateNotSpecifiedFilter::class.java) 
      } 
     } 
    } 

が、ある明確ではありませんgetAnnotation()が有効であるように、対応するDateRequired注釈を実装する方法。 getAnnotation()用(Java)の署名が

public <T extends Annotation> T getAnnotation(Class<T> annotationClass) 

は、私はそれが同じパッケージ内にあるものの、明示的に注釈をインポートする必要があり、IntelliJのバグのように見えるさ:

... 
import DateRequired 

@Provider 
class DateRequiredFeature : DynamicFeature { 
    override fun configure(resourceInfo: ResourceInfo, context: FeatureContext) { 
     if (resourceInfo.resourceMethod.getAnnotation(DateRequired::class.java) != null) { 
      context.register(DateNotSpecifiedFilter::class.java) 
     } 
    } 
} 

すべて標準のKotlinアノテーションを使用しています。annotation class DateRequired

+0

あなたのやりたいことはわかりません。注釈をコトリンに再コードしますか? – Mibac

+0

コール 'resourceInfo.resourceMethod.getAnnotation(DateRequired ..)'が機能するように、私はKotlinで 'DateRequired'アノテーションを実装したいと思います。 –

答えて

2

注釈の実装KotlinのアトオンはJavaより簡単です。 KotlinのデフォルトRetentionPolicyRUNTIMEです。 FUNCTIONPROPERTY_GETTERPROPERTY_SETTERは、例えば、JavaのElementType.METHODにマッピングされます:

import kotlin.annotation.AnnotationTarget.* 

@Target(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER) 
annotation class DateRequired; 

第二に、私はまた、あなたがjava.reflect.Methodインスタンスを返すJavaプラットフォームクラスResourceInfoを使用し発見しました。 が返され、KotlinにNullPointerExceptionが返されます。

resourceInfo.resourceMethod!!.getAnnotation(DateRequired::class.java) 
//       ^--- force to call 

最後、DynamicFeatureはインターフェイスです:あなたはgetAnnotationメソッドを呼び出す前にNPE-lovers operator!!を使用する必要があります。

@Provider 
class DateRequiredFeature : DynamicFeature{...} 

あなたは注釈hereの詳細を見ることができます:あなたは括弧()を削除する必要がありますkotlinのインターフェイスを実装します。

+0

はい、それは私が試みたものです。私は 'getAnnotation()'呼び出しで 'DateRequired'のクラスを参照することができません。 –

+0

@DavidSorokoこれまでどんなエラーが報告されていますか?実際、kotlinアノテーションクラスはあなたのようにJavaの '@ interface'に変換されます。多分あなたの論理が間違っている? –

+0

私のメモを参照してください、IntelliJの問題のように見えます。 –

関連する問題