MOXy/JAXB接口注释

MOXy/JAXB接口注释,jaxb,moxy,Jaxb,Moxy,我有一个模型,它由一个带有注释属性的接口和一个不重新注释该属性的实现的具体实现器组成。为什么这个解组不正确(使用MOXy 2.5.0)?我得到一个正确构造的对象,但该属性从未绑定到XML: /** *带注释的接口 */ @XmlRootElement(name=“IInterface”) 公共接口接口 { @xmltattribute(name=“id”) 公共无效设置id(内部id); } /** *具体实施者 */ @XmlRootElement(name=“InterfaceImpl”

我有一个模型,它由一个带有注释属性的接口和一个不重新注释该属性的实现的具体实现器组成。为什么这个解组不正确(使用MOXy 2.5.0)?我得到一个正确构造的对象,但该属性从未绑定到XML:


/**
*带注释的接口
*/
@XmlRootElement(name=“IInterface”)
公共接口接口
{
@xmltattribute(name=“id”)
公共无效设置id(内部id);
}
/**
*具体实施者
*/
@XmlRootElement(name=“InterfaceImpl”)
公共类接口IMPL实现I接口
{
私有int m_id=-1;
@凌驾
公共无效集合id(内部id)
{
m_id=id;
}   
}
/**
*解组码
*/
文件f=新文件(“src\\resources\\Interface.xml”);
JAXBContext context=JAXBContext.newInstance(我的路径);
Unmarshaller u=context.createUnmarshaller();
InterfaceImpl i=(InterfaceImpl)u.unmarshal(f);
如果我将IInterface更改为抽象类,它会正常工作-抽象类和接口不应该以相同的方式处理吗?这是预期的行为,还是已知的问题


谢谢

oxm.xml

您可以使用EclipseLink JAXB(MOXy的)外部绑定文件使MOXy认为
IInterface
InterfaceImpl
的超类,而不是
对象


演示

下面是创建
JAXBContext
时如何指定映射文档。为了这个演示的目的,我在
interfaceeimpl
中添加了一个
getId
方法,这样我就可以显示解组工作了

用于UM16878949的包;
导入java.io.File;
导入java.util.*;
导入javax.xml.bind.*;
导入org.eclipse.persistence.jaxb.JAXBContextProperties;
公开课演示{
私有静态字符串MY_PATH=“forum16878949”;
公共静态void main(字符串[]args)引发异常{
/**
*解组码
*/
映射属性=新的HashMap(1);
put(JAXBContextProperties.OXM_元数据_源,“forum16878949/OXM.xml”);
文件f=新文件(“src/forum16878949/Interface.xml”);
JAXBContext context=JAXBContext.newInstance(我的路径,IInterface.class.getClassLoader(),属性);
Unmarshaller u=context.createUnmarshaller();
InterfaceImpl i=(InterfaceImpl)u.unmarshal(f);
System.out.println(i.getId());
}
}
Interface.xml


输出

123
了解更多信息


    • oxm.xml

      您可以使用EclipseLink JAXB(MOXy的)外部绑定文件使MOXy认为
      IInterface
      InterfaceImpl
      的超类,而不是
      对象

      
      
      演示

      下面是创建
      JAXBContext
      时如何指定映射文档。为了这个演示的目的,我在
      interfaceeimpl
      中添加了一个
      getId
      方法,这样我就可以显示解组工作了

      用于UM16878949的包;
      导入java.io.File;
      导入java.util.*;
      导入javax.xml.bind.*;
      导入org.eclipse.persistence.jaxb.JAXBContextProperties;
      公开课演示{
      私有静态字符串MY_PATH=“forum16878949”;
      公共静态void main(字符串[]args)引发异常{
      /**
      *解组码
      */
      映射属性=新的HashMap(1);
      put(JAXBContextProperties.OXM_元数据_源,“forum16878949/OXM.xml”);
      文件f=新文件(“src/forum16878949/Interface.xml”);
      JAXBContext context=JAXBContext.newInstance(我的路径,IInterface.class.getClassLoader(),属性);
      Unmarshaller u=context.createUnmarshaller();
      InterfaceImpl i=(InterfaceImpl)u.unmarshal(f);
      System.out.println(i.getId());
      }
      }
      
      Interface.xml

      
      
      输出

      123
      
      了解更多信息


      感谢您的回复,布莱斯-您就是我想听到的人。:)因此,听起来我不应该期望它按我希望的方式工作,也就是说,如果不事先知道特定类型,就无法解组实现带注释接口的类。我必须说,我仍然不清楚为什么接口的行为与抽象类不同,我理解它们在语义上是相同的“不同的“从JVM的角度来看,但我不明白为什么JAXB必须以任何不同的方式对待它们。您能否提供一些关于解组算法的见解,以强调为什么这在技术上不可行?@StephenCarlson-我已经找到了一种支持您的用例的方法。我用一个完整的例子重做了我的答案。这很好,我会接受它作为正确的答案,尽管我仍然希望对解组过程有更多的了解,这将解释为什么接口与抽象类的处理方式不同。如果我可以用接口类型声明变量,我应该也能用接口类型声明带注释的属性。是吗?谢谢你的回答,布莱斯-你就是我想听的人。:)因此,听起来我不应该期望它按我希望的方式工作,也就是说,如果不事先知道特定类型,就无法解组实现带注释接口的类。我必须说,我仍然不清楚为什么接口的行为与抽象类不同,我理解它们在语义上是相同的从JVM的角度来看,“不同”,但我不明白为什么JAXB必须以任何不同的方式对待它们。您能否提供一些关于解组算法的见解,以强调为什么这在技术上是不可行的?@StephenCarlson-我认为