Fra*_*fka 4 java xml jaxb unmarshalling moxy
我写了一个bean(BaseBeanEx)扩展了一个JAXB注释bean(BaseBean).它BaseBean位于数据结构中的某个列表中,无法更改.软件会在BaseBeanEx需要时进行显式转换.我还写了一个ObjectFactory创建BaseBeanEx而不是BaseBean.这一切工作正常,但现在我添加了一个afterUnmarshal到方法BaseBeanEx永远也不会被调用.
这是一个错误还是根据规格?如果以后是这种情况,是否有一些优雅的工作?
我正在使用默认的JAXB引擎.
注意: 我是EclipseLink JAXB(MOXy)的负责人,也是JAXB 2(JSR-222)专家组的成员.
afterUnmarshal没有被调用的原因是BaseBeanEx元数据是在BaseBean类上构建的.为了让你的用例工作,你需要让你的JAXB impl知道你真的想映射到的实例BaseBeanEx.
选项#1 - 使用注释的任何JAXB实现
根
您可以使用@XmlElement注释覆盖字段/属性的类型.在下面的示例中,方法的签名是List<BaseBean>,但是@XmlElement注释通知JAXB实现应该将属性解释为List<BaseBeanEx>.
package forum10174513;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Root {
private List<BaseBean> baseBeans;
@XmlElement(name="base-bean", type=BaseBeanEx.class)
public List<BaseBean> getBaseBeans() {
return baseBeans;
}
public void setBaseBeans(List<BaseBean> baseBeans) {
this.baseBeans = baseBeans;
}
}
Run Code Online (Sandbox Code Playgroud)
选项#2 - 使用MOXy的外部映射文档
BaseBean位于数据结构中的某个List中,无法更改.
如果您无法修改域模型并使用MOXy作为JAXB提供程序,则可以利用其外部映射文档来应用元数据,而无需修改域模型.
bindings.xml
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum10174513">
<java-types>
<java-type name="Root">
<java-attributes>
<xml-element
java-attribute="baseBeans"
name="base-bean"
type="forum10174513.BaseBeanEx"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
Run Code Online (Sandbox Code Playgroud)
演示
下面是一些代码,演示如何引导JAXBContext利用外部映射文档的代码.目前存在一个错误,即仅通过外部映射文档引用的类将不会注册事件方法(http://bugs.eclipse.org/376876).您可以通过在用于创建的类列表中明确包含此类来解决此问题JAXBContext.
package forum10174513;
import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum10174513/bindings.xml");
JAXBContext jc = JAXBContext.newInstance(new Class[] {Root.class, BaseBeanEx.class}, properties);
File xml = new File("src/forum10174513/input.xml");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Root root = (Root) unmarshaller.unmarshal(xml);
}
}
Run Code Online (Sandbox Code Playgroud)
BaseBean
package forum10174513;
public class BaseBean {
}
Run Code Online (Sandbox Code Playgroud)
BaseBeanEx
package forum10174513;
import javax.xml.bind.Unmarshaller;
public class BaseBeanEx extends BaseBean {
public void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
System.out.println("AFTER UNMARSHAL WAS CALLED");
}
}
Run Code Online (Sandbox Code Playgroud)
产量
下面是运行演示代码生成的输出.
AFTER UNMARSHAL WAS CALLED
AFTER UNMARSHAL WAS CALLED
Run Code Online (Sandbox Code Playgroud)
欲获得更多信息
| 归档时间: |
|
| 查看次数: |
3607 次 |
| 最近记录: |