【问题标题】:JAXB how to remove anything from JDefinedClassJAXB 如何从 JDefinedClass 中删除任何内容
【发布时间】:2015-09-20 09:01:50
【问题描述】:

我正在使用 jaxb 从 xsd 生成代码。

生成的代码包含很多注解;用于类和字段。

我正在尝试使用com.sun.tools.internal.xjc.Plugin 来修改生成的代码。

在插件run() 方法中,我们得到一个Outline 类,我们可以从中获取ClassOutlineClassOutline 有一个 JDefinedClass final 成员,其中包含将生成的实际类的信息。

如果我想添加任何东西,JDefinedClass 中有可以使用的 api。但是如果我想删除一些东西,那就没有办法了。

例如我无法清除注释,因为JDefinedClass.annotations() 方法返回UnmodifiableCollection。所以我无法清除它或从中删除任何东西。

我尝试通过调用_class 方法创建另一个JDefinedClass,但ClassOutline.implClass 变量是最终变量,所以我无法设置它。

如何获得没有任何注释的JDefinedClass

我可以进入另一个代码生成阶段来真正控制JDefinedClass的生成吗?

【问题讨论】:

  • 简短回答:您需要从模型中删除内容,而不是从代码模型中删除。答案很长。
  • 我看到有一个postProcessModel 方法,以Model 作为输入。我看到如何可以操纵这个Model 来删除注释
  • 我看到BeanGenerator 在调用implClass.annotate2 之前没有做任何检查。没有办法停止它的调用
  • 我终于做到了。从_package 中删除了每个JDefinedClass。添加了具有相同名称的新JDefinedClass,并从原始JDefinedClass 复制了implementsextendsfiledsmethodsjavadoc 等。有点乏味,但找不到其他事情可做。

标签: jaxb


【解决方案1】:

代码模型实际上主要是“只写”。但是,说到注解,你可能错过了com.sun.codemodel.JDefinedClass.removeAnnotation(JAnnotationUse)com.sun.codemodel.JMethod.removeAnnotation(JAnnotationUse)(从com.sun.codemodel.JAnnotatable.removeAnnotation(JAnnotationUse) 实现)之类的方法。

所以他们就在那里。您可以使用普通 CodeModel API 删除注释。

如我所见,您还可以从类中删除字段和方法。那么你到底错过了什么?

【讨论】:

  • 实际上在我的jdk1.7.0_55\lib\tools.jar 中,JDefinedClassJMethod 没有任何称为removeAnnotation 的方法。是的,JDefinedClass 中有一个removeField
  • @weima 不要使用 JDK 内部的 XJC。我检查了一些或多或少的实际 JAXB RI。
  • 你的意思是我应该安装 jaxb-ri 并使用它的 xjc。哪个是提供 JAXB RI 实现的发行版?你能建议吗?我找不到任何甚至包含JDefinedClass 的 jaxb-ri impl。我看到了com.sun.xml.bind » jaxb-impl
  • 我的老板也告诉我不要使用供应商特定的 API。 com.sun.tools.internal.xjc.Plugin 不是特定于供应商的吗?我找不到任何其他 Plugin
  • 从这里使用 jaxb-ri 而不是 "jaxb.java.net/downloads/ri" 版本 2.2.11\
【解决方案2】:

JDefinedClass.annotations() 它返回一个不可修改的集合对象,你不能修改它们。

因此,解决此问题,您可以在构建 JCodeModel 之前在类和字段级别限制注释添加/删除。

您需要创建一个自定义 Jackson2Annotator 类来扩展 Jackson2Annotator 并根据您的要求覆盖它们的方法。

以下是一些用于特定类型注释属性的方法:

  1. propertyOrder(OTB JsonPropertyOrder)
  2. propertyInclusion(OTB JsonInclude)
  3. propertyField(可用于字段级别的自定义注释)

您可以通过查看 Jackson2Annotator 类来发现更多符合您需求的内容。

【讨论】:

    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2021-07-19
    • 2012-08-16
    相关资源
    最近更新 更多