【问题标题】:JAXB constructor injectionJAXB 构造函数注入
【发布时间】:2010-07-23 08:56:24
【问题描述】:

我想知道如何让 JAXB 编译器使我的 XML 模式中的某些元素在 java 类定义中声明为 final,并且我还希望能够控制不同的构造函数,就像我想要的那样一个构造函数,它可以使用包含在类中的完整参数列表以及 JAXB 所需的默认私有构造函数来创建对象。

有什么帮助吗?

谢谢。

这是我正在尝试做的一个示例:

<xs:complexType name="mycomplex">
    <xs:all>
        <xs:element name="myboolean" type="xs:boolean"/>
    </xs:all>
</xs:complexType>

现在生成的代码看起来像

public class mycomplex
{
        protected boolean myboolean;

        public boolean getMyboolean() { return myboolean; }
        public void setMyboolean(boolean b) { this.myboolean = b; }
}

但我想编辑架构使其看起来像:

public class mycomplex
{
        protected final boolean myboolean;

        public mycomplex(boolean b) { this.myboolean = b; }

        public boolean getMyboolean() { return myboolean; }
}

这可以实现吗?

【问题讨论】:

  • 请给我们一些例子,包括你所说的模式组件的种类,以及你希望它们在 java 中如何表示。
  • 原帖已编辑。有可能吗?
  • 我不认为它是,不。据我所知,构造函数注入从未添加到 JAXB2 中,尽管我认为它是有计划的。
  • Kohsuke 解释了为什么这里不可能:weblogs.java.net/blog/kohsuke/archive/2005/02/…。就个人而言,我认为这是 Bull$%#$ 无论如何都已经使用 Unsafe 了。还有一个构造函数注入的JDK注解:docs.oracle.com/javase/6/docs/api/java/beans/…

标签: java jaxb customization constructor-injection


【解决方案1】:

没有标准的 JAXB 方法来生成类似的类,因为 JAXB 规范不支持映射到类似的类。

您可以使用以下代码来避免使用 set 方法。只要有一个公共的默认构造函数,你就可以添加额外的构造函数。

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;

@XmlAccessorType(XmlAccessType.FIELD)
public class mycomplex    
{    
        protected final boolean myboolean;    

        public boolean getMyboolean() { return myboolean; }    
}    

如果您想将上述类与非默认构造函数和标记为 final 的字段一起使用,您将需要创建一个 XmlAdapter:

【讨论】:

  • 非常感谢您,但这并不完全是我想要的。我将解组数百个类,这意味着做这样的事情将非常乏味,因为我必须自己定义所有内容,并且这些类都会不时变化-->如果我必须重新定义非常耗时一直以来的事情。有没有办法在数百个不同类的更自动化的过程中适应这种类型的行为?再次感谢。
  • @BlaiseDoughan 您是否有机会将 docs.oracle.com/javase/6/docs/api/java/beans/… 添加到您的 Moxy 中?
  • @AdamGent - 您介意将此作为对以下增强请求的评论吗?:bugs.eclipse.org/328951
【解决方案2】:

我已经用另一种方式解决了这个问题。我正在创建一个工具,该工具将编辑生成的 java 源代码文件,并将添加/删除我需要的内容。更多信息请参考:Using the Eclipse AST

【讨论】:

    【解决方案3】:

    我有类似的问题,我找到了以下库: http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#immutable

    现在一切看起来都那么简单;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 2011-01-11
      相关资源
      最近更新 更多