我正在Kotlin中实现dropwizard示例应用程序,并且在实现DateRequiredFeature时遇到了问题。 Java代码如下:
@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);
}
}
}
注释定义为:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DateRequired {}
对于Kotlin方面我有这个功能:
@Provider
class DateRequiredFeature : DynamicFeature(){
override fun configure(resourceInfo: ResourceInfo, context: FeatureContext) {
if (resourceInfo.resourceMethod.getAnnotation(DateRequired::class.java) != null) {
context.register(DateNotSpecifiedFilter::class.java)
}
}
}
但不清楚如何实现相应的DateRequired
注释,以便getAnnotation()
有效。 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 :(得分:2)
在Kotlin中实现注释比在Java中更简单。 Kotlin中的默认RetentionPolicy
为RUNTIME
。 FUNCTION
,PROPERTY_GETTER
和PROPERTY_SETTER
已映射到Java ElementType.METHOD
,例如:
import kotlin.annotation.AnnotationTarget.*
@Target(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER)
annotation class DateRequired;
其次,我还发现您使用了一个返回ResourceInfo
实例的Java平台类java.reflect.Method
。它可能会返回null
,导致Kotlin中的NullPointerException
。在调用!!
方法之前,您必须使用NPE-lovers operator getAnnotation
:
resourceInfo.resourceMethod!!.getAnnotation(DateRequired::class.java)
// ^--- force to call
最后,DynamicFeature
是一个界面。在kotlin中实现一个接口,你必须删除括号()
:
@Provider
class DateRequiredFeature : DynamicFeature{...}
您可以查看有关注释here的更多详细信息。