2017-06-25 5 views
0

Ich implementiere die Dropwizard-Beispielanwendung in Kotlin und habe ein Problem bei der Implementierung von DateRequiredFeature. Der Java-Code-Code ist wie folgt:Implementierung einer Java-Annotation in Kotlin

@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); 
      } 
     } 
    } 

mit der Anmerkung wie folgt definiert:

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

Für die Kotlin Seite I für das Merkmal haben:

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

aber ist nicht klar, wie Sie die entsprechende DateRequired Annotation implementieren, so dass getAnnotation() gültig ist. Die (Java) Signatur für getAnnotation() ist

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

Hinweis

Sieht aus wie ein IntelliJ Fehler, ich brauche die Anmerkung ausdrücklich importieren, obwohl sie im selben Paket ist:

... 
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) 
     } 
    } 
} 

dann ist alles gut mit Standard-Kotlin-Annotation annotation class DateRequired

+0

Ich bin mir nicht sicher, was Sie tun möchten. Möchten Sie die Anmerkung zu Kotlin rekodieren? – Mibac

+0

Ich möchte "DateRequired" Annotation in Kotlin so implementieren, dass der Aufruf 'resourceInfo.resourceMethod.getAnnotation (DateRequired ..)' funktioniert. –

Antwort

2

Implementieren eines Annot in Kotlin ist einfacher als in Java. Die Standardeinstellung RetentionPolicy in Kotlin ist RUNTIME. Die FUNCTION, PROPERTY_GETTER und PROPERTY_SETTER sind auf Java abgebildet ElementType.METHOD, zum Beispiel:

import kotlin.annotation.AnnotationTarget.* 

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

Zweitens, ich habe Sie eine Java-Plattform-Klasse auch entdeckt ResourceInfo verwendet, die eine java.reflect.Method Instanz zurückgibt. Es könnte null zurückgeben, was zu NullPointerException in Kotlin führt. Sie müssen die NPE-lovers operator!! vor dem Aufruf des getAnnotation Methode verwenden:

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

Last, die DynamicFeature eine Schnittstelle ist. in eine Schnittstelle implementiert Kotlin Sie die Klammern () entfernen müssen:

@Provider 
class DateRequiredFeature : DynamicFeature{...} 

können Sie weitere Details sehen Anmerkungen here.

+0

Ja, das habe ich ausprobiert. Ich kann nicht auf die Klasse von 'DateRequired' im Aufruf 'getAnnotation()' verweisen. –

+0

@DavidSoroko hat einen Fehler gemeldet? In der Tat wird die Kotlin-Annotationsklasse in Java '@ interface' umgewandelt wie bei Ihnen. Vielleicht ist deine Logik falsch? –

+0

sehen Sie meine Notiz, sieht aus wie ein IntelliJ Problem. –

Verwandte Themen