Java 如何编写在jaxb中无法控制的对象?

Java 如何编写在jaxb中无法控制的对象?,java,xml,jaxb,Java,Xml,Jaxb,我正试图找到一种方法来马歇尔我无法访问的课程。我正在努力实现这样的目标: @XmlRootElement(name="bar") class Bar { @XmlAttribute private Foo foo; @XmlAttribute private String baz; } <bar baz="stuff" foo="otherstuff"/> 这将产生如下xml文件: @XmlRootElement(name="bar") class Bar {

我正试图找到一种方法来马歇尔我无法访问的课程。我正在努力实现这样的目标:

@XmlRootElement(name="bar")
class Bar {
  @XmlAttribute
  private Foo foo;

  @XmlAttribute
  private String baz;
}
<bar baz="stuff" foo="otherstuff"/>
这将产生如下xml文件:

@XmlRootElement(name="bar")
class Bar {
  @XmlAttribute
  private Foo foo;

  @XmlAttribute
  private String baz;
}
<bar baz="stuff" foo="otherstuff"/>


这可能吗?我试图摆弄
@XmlJavaTypeAdapter
,但没有成功。

如果您无权访问用于生成XML文件的类,但可以访问基于/用于生成这些类的模式,那么您应该能够使用xjc和模式定义(xsd)重新生成这些类文件。

您使用XmlJavaTypeAdapter的方法是正确的,但我怀疑foo需要是一个XmlElement而不是一个XmlAttribute:

@XmlRootElement(name="bar")
public class Bar {

  @XmlElement
  @XmlJavaTypeAdapter(FooAdapter.class)
  private Foo foo;

  @XmlAttribute
  private String baz;

}
FooAdapter可以像下面这样简单,但是如果您创建一个代理对象来表示Foo并封送它,而不是对象[],那么输出会更漂亮

class FooAdapter extends XmlAdapter<Object[], Foo> {

    @Override
    public Object[] marshal(Foo v) throws Exception {
        return new Object[]{ v.x, v.y, v.z };
    }

    @Override
    public Foo unmarshal(Object[] v) throws Exception {
        Foo foo = new Foo();
        foo.x = (String) v[0];
        foo.y = (Integer) v[1];
        foo.z = (Double) v[2];
        return foo;
    }

}
class FooAdapter扩展了XmlAdapter{
@凌驾
公共对象[]封送处理(Foo v)引发异常{
返回新对象[]{v.x,v.y,v.z};
}
@凌驾
public Foo unmarshal(对象[]v)引发异常{
Foo-Foo=新的Foo();
foo.x=(字符串)v[0];
foo.y=(整数)v[1];
foo.z=(双)v[2];
返回foo;
}
}

您可以访问Bar源代码,但不能访问Foo?您可以使用EclipseLink JAXB(MOXy)中的外部映射文档:@KyleMahan Bar source是,Foo source否。。。没错,嗯。。。我想我还不够清楚。。。没有xml架构。。。一切都是基于注释的。它归结为一个问题:“当我无法访问这些类时,我如何教授JAXB关于新类的知识?”是的,这非常好用。。。实际上,如果您创建一个
XmlAdapter
,它甚至可以与
@xmldattribute
一起工作。有没有一种方法可以不使用Bar类就离开
Marshaller
有一个采用
XmlAdapter
setAdapter
函数。。。但是仅注册
FooAdapter
和编组
Foo
是不起作用的。