Java 有没有一种方法可以使用自定义XMLAdapter实现@XmlPath(";)的功能?

Java 有没有一种方法可以使用自定义XMLAdapter实现@XmlPath(";)的功能?,java,xml,jaxb,eclipselink,moxy,Java,Xml,Jaxb,Eclipselink,Moxy,我试图使用JAXB/Moxy对POJOjava类进行解组和封送处理。封送处理工作正常,但解封处理未按预期工作。经过大量的尝试和分析,我发现这是由于注释@XmlPath(“.”造成的 我希望保留@XmlPath(“.”)的功能,但不使用注释,而不是从XMLAdapter获取该功能。但我对如何实现这一目标感到困惑。我想知道这里是否有人能帮我 以下是我拥有的XML: <Customer xmlns:google="https://google.com/test">

我试图使用
JAXB/Moxy
POJO
java类进行
解组和封送处理。
封送处理
工作正常,但
解封处理
未按预期工作。经过大量的尝试和分析,我发现这是由于注释
@XmlPath(“.”
造成的

我希望保留
@XmlPath(“.”)的功能,但不使用注释,而不是从
XMLAdapter
获取该功能。但我对如何实现这一目标感到困惑。我想知道这里是否有人能帮我

以下是我拥有的
XML

<Customer xmlns:google="https://google.com/test">
    <name>BATMAN</name>
    <age>2008</age>
    <google:main>
        <google:sub>bye</google:sub>
    </google:main>
</Customer>
我想删除
@XmlPath(“.”
,并通过
XmlAdapter
保留其功能。因此,当我使用JACKSON将此XML转换为JSON时,我得到以下输出:

{
    "name" : "Rise Against",
    "age" : "2000",
    "google:main":{
        "google:sub" : "bye"
    }
}
当我封送XML时,我得到了上面提供的XML文件(注意,
others
节点没有被添加,但是它的内容被添加到XML和JSON中)

以下是我目前拥有的
XMLAdapter

class TestAdapter extends XmlAdapter<Wrapper, Map<String, Object>> {

  @Override
  public Map<String, Object> unmarshal(Wrapper value) throws Exception {
    //Loop across all elements within ILMD tag
    final Map<String, Object> extensions = new HashMap<>();

    for (Object obj : value.getElements()) {
      Element element = (Element) obj;

      //System.out.println("Node Name : " + element.getNodeName() + " Value : " + element.getTextContent());

      final NodeList children = element.getChildNodes();

      if (children.getLength() == 1) {
        extensions.put(element.getNodeName(), element.getTextContent());
      } else {
        List<Object> child = new ArrayList<>();
        for (int i = 0; i < children.getLength(); i++) {
          final Node n = children.item(i);
          if (n.getNodeType() == Node.ELEMENT_NODE) {
            Wrapper wrapper = new Wrapper();
            List childElements = new ArrayList();
            childElements.add(n);
            wrapper.elements = childElements;
            child.add(unmarshal(wrapper));
          }
        }
        extensions.put(element.getNodeName(), child);
      }
    }
    return extensions;
  }

  @SuppressWarnings("unchecked")
  @Override
  public Wrapper marshal(Map<String, Object> v) throws Exception {
    Wrapper wrapper = new Wrapper();
    List elements = new ArrayList();
    for (Map.Entry<String, Object> property : v.entrySet()) {
      if (property.getValue() instanceof Map) {
        elements.add(new JAXBElement<Wrapper>(new QName(property.getKey()), Wrapper.class, marshal((Map) property.getValue())));
      } else {
        elements.add(new JAXBElement<String>(new QName(property.getKey()), String.class, property.getValue().toString()));
      }
    }
    wrapper.elements = elements;
    return wrapper;
  }
}

class Wrapper {
  @XmlAnyElement
  List elements;
  public List getElements() {
    return elements;
  }
}
有人能告诉我如何使用
XMLAdapter
获得
Moxy@XmlPath(“.”)的功能吗?任何帮助都将不胜感激

class TestAdapter extends XmlAdapter<Wrapper, Map<String, Object>> {

  @Override
  public Map<String, Object> unmarshal(Wrapper value) throws Exception {
    //Loop across all elements within ILMD tag
    final Map<String, Object> extensions = new HashMap<>();

    for (Object obj : value.getElements()) {
      Element element = (Element) obj;

      //System.out.println("Node Name : " + element.getNodeName() + " Value : " + element.getTextContent());

      final NodeList children = element.getChildNodes();

      if (children.getLength() == 1) {
        extensions.put(element.getNodeName(), element.getTextContent());
      } else {
        List<Object> child = new ArrayList<>();
        for (int i = 0; i < children.getLength(); i++) {
          final Node n = children.item(i);
          if (n.getNodeType() == Node.ELEMENT_NODE) {
            Wrapper wrapper = new Wrapper();
            List childElements = new ArrayList();
            childElements.add(n);
            wrapper.elements = childElements;
            child.add(unmarshal(wrapper));
          }
        }
        extensions.put(element.getNodeName(), child);
      }
    }
    return extensions;
  }

  @SuppressWarnings("unchecked")
  @Override
  public Wrapper marshal(Map<String, Object> v) throws Exception {
    Wrapper wrapper = new Wrapper();
    List elements = new ArrayList();
    for (Map.Entry<String, Object> property : v.entrySet()) {
      if (property.getValue() instanceof Map) {
        elements.add(new JAXBElement<Wrapper>(new QName(property.getKey()), Wrapper.class, marshal((Map) property.getValue())));
      } else {
        elements.add(new JAXBElement<String>(new QName(property.getKey()), String.class, property.getValue().toString()));
      }
    }
    wrapper.elements = elements;
    return wrapper;
  }
}

class Wrapper {
  @XmlAnyElement
  List elements;
  public List getElements() {
    return elements;
  }
}
public class CustomExtensionsSerializer extends JsonSerializer<Map<String, Object>> {

  private static final ObjectMapper mapper = new ObjectMapper();

  @Override
  public void serialize(Map<String, Object> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    gen.writeStartObject();
    recusiveSerializer(value, gen, serializers);
    gen.writeEndObject();
  }

  public void recusiveSerializer(Map<String, Object> value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    for (Map.Entry<String, Object> extension : value.entrySet()) {
      if (extension.getValue() instanceof Map) {
        //If instance is MAP then call the recursive method
        recusiveSerializer((Map) extension.getValue(), gen, serializers);
      } else if (extension.getValue() instanceof String) {
        //If instance is String directly add it to the JSON
        gen.writeStringField(extension.getKey(), (String) extension.getValue());
      } else if (extension.getValue() instanceof ArrayList) {
        //If instance if ArrayList then loop over it and add it to the JSON after calling recursive method
        gen.writeFieldName(extension.getKey());
        gen.writeStartObject();
        for (Object dupItems : (ArrayList<String>) extension.getValue()) {
          if (dupItems instanceof Map) {
            recusiveSerializer((Map) dupItems, gen, serializers);
          } else {
            gen.writeStringField(extension.getKey(), (String) extension.getValue());
          }
        }
        gen.writeEndObject();
      }
    }
  }
}