2017-07-31 134 views
0

对于我的项目,我将类转换为json和jackson fasterXml。 现在,我必须在一个位置更改对象的转换方式,以便忽略@JsonIgnore并对该属性进行序列化。Java自定义注释不可见

我发现我可以通过扩展JacksonAnnotationIntrospector和自定义注释来实现。问题是自定义注释只有在与实现类相同的package/project/osgi bundle中定义时才可见,而我想在公开json转换的服务包中定义它。如果注释位于实现包中,我不能在JacksonAnnotationIntrospector中引用它,我需要检查注释的名称。

我有唯一的区别两个相同的注释软件包:

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface AnnotationName { 

} 

当我同时设置该实现,我只看到同一封装/项目/ OSGi包作为实现类内从所定义的注释。 有没有这方面的限制或有任何人的想法可能是什么问题?

+0

嗯*我有两个相同的注释* ...为什么你不使用**独特的**名字? – GhostCat

+0

我在两个定义中的一个中添加了2,因此它们是唯一的。我不认为这是JacksonAnnotationIntrospector中的一个问题,因为无论我在哪里调试,我都可以从实现类包中找到注释,并且无法从服务包中找到它。 – user1147747

+0

那么,你是否导入了其他注释?你是否试图用包括包装在内的全名引用它? – RealSkeptic

回答

1

将您的自定义注释放在一个唯一的包中,理想情况下使用您控制的反向域名。把它放到一个单独的API包中(至少现在是这样)。

在您的用户代码中添加API包到maven依赖项并使用新的注释。 maven-bundle-plugin(或你使用的)应该在你的Manifest中创建一个Import-Package语句。这将确保注释可以在运行时连线。

在解析注释的代码中,确保使用用户包的类加载器。这个类加载器应该能够看到标准注释以及自定义注释。

+0

我找到了解决方案,我使用了我导出的子包“注释”(使用api。*),但是我只用maven包插件导入api。我试图将注释移动到使其工作的api包。 – user1147747

+0

@ user1147747道德故事:不要使用带*的进口。始终导入完整的班级名称并拥有显式导入的完整列表。 – RealSkeptic

+0

最重要的部分是让maven-bundle-plugin发挥它的魔力。它通常会计算出进口量。所以最好保持默认值。 –